如何将此SQL转换为Oracle

zzlelutf  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(209)

我主要使用SQL。我不知道如何将该查询转换为Oracle。有人能告诉我如何转换吗?

DECLARE @START_YEAR INT,@MONTH INT, @END_YR INT
    SELECT 
    @START_YEAR = 2010,
    @END_YR = 2010,
    @MONTH = 1

    WHILE ( @START_YEAR <= @END_YR)
    BEGIN
    WHILE ( @MONTH <= 12)
    BEGIN

    PRINT 'INSERT INTO dbo.Mem_TXN
               ([VALUE]
               ,[BEGIN_DATE]
               ,[END_DATE]
               ,[CREATED_BY]
               ,[CREATED_DATE]
               ,[MODIFIED_BY]
               ,[MODIFIED_DATE])
         VALUES
               (''RGLR'' 
               ,'''  + cast( Convert(date, DATEADD(MONTH, @MONTH - 1, DATEADD(YEAR, @START_YEAR - 1900, 0)))  AS varchar) + '''  
               ,''' + cast( Convert(date,DATEADD(MONTH, @MONTH,     DATEADD(YEAR, @START_YEAR - 1900, -1))) AS VARCHAR) + '''
               ,''admin''
               ,' +FORMAT(GETDATE(), 'yyyy-mm-dd hh:mm')+ '
               ,''admin''
               ,' +FORMAT(GETDATE(), 'yyyy-mm-dd hh:mm')+ '
               ,0);
               '
    SET @MONTH = @MONTH + 1
    END
    SET @MONTH = 1
    SET @START_YEAR = @START_YEAR + 1
    END

此SQL是Oracle生成输入语句所必需的。提前感谢您。

fbcarpbf

fbcarpbf1#

我试着用Oracle Sql Developer,代码是这样的:

DECLARE
    v_START_YEAR NUMBER(10);
    v_MONTH NUMBER(10);
    v_END_YR NUMBER(10);
    v_QUERY NVARCHAR2(2000);
    v_DATENOW NVARCHAR2(20);
    v_DATEFST NVARCHAR2(15);
    v_DATELST NVARCHAR2(15);
    v_DATECHAR NVARCHAR2(15);
BEGIN
    v_START_YEAR := 2010;
    v_END_YR := 2010;
    v_MONTH := 1;

    SELECT to_char(sysdate,'yyyy-MM-dd hh24:mi') INTO v_DATENOW FROM dual;

    WHILE  v_START_YEAR <= v_END_YR
    LOOP
        WHILE ( v_MONTH <= 12)
        LOOP
            --date char
            v_DATECHAR := ''||to_char(v_START_YEAR)||'-'||to_char(v_MONTH)||'-01';

            --first date
            select to_char(TRUNC(TO_DATE(v_DATECHAR, 'YYYY-MM-DD'), 'MM'), 'yyyy-MM-dd') into v_DATEFST from dual;
            -- last date
            select to_char(LAST_DAY(ADD_MONTHS(TO_DATE(v_DATECHAR, 'YYYY-MM-DD'),0)), 'yyyy-MM-dd') into v_DATELST from dual;

            v_QUERY := 'INSERT INTO Mem_TXN
                        (VALUE,
                        BEGIN_DATE,
                        END_DATE,
                        CREATED_BY,
                        CREATED_DATE,
                        MODIFIED_BY,
                        MODIFIED_DATE)
                        VALUES (
                            ''RGLR'',
                            '|| v_DATEFST ||',
                            '|| v_DATELST ||',
                            ''admin'',
                            '|| v_DATENOW ||',
                            ''admin'',
                            '|| v_DATENOW ||',
                            0
                        )';

            dbms_output.put_line(v_QUERY);

        v_MONTH := v_MONTH + 1;
        END LOOP;
        v_MONTH := 1;
        v_START_YEAR := v_START_YEAR + 1;
    END LOOP;
END;
/

后来结果是这样的:view result

ryevplcw

ryevplcw2#

下面是一个插入语句,它可以满足您的需要:

INSERT INTO dbo.men_txn ("VALUE", begin_date, end_date, created_by, created_date, modified_by, modified_date)
WITH dts AS (SELECT add_months(to_date('01/01/2010', 'dd/mm/yyyy'), LEVEL - 1) dt
             FROM   dual
             CONNECT BY LEVEL <= 12)
SELECT 'RGLR' val,
       dt month_start,
       last_day(dt) month_end,
       'admin',
       SYSDATE,
       'admin',
       SYSDATE
FROM   dts;

可以说,这比递归CTE更容易阅读和遵循,但您也可以按如下所示执行相同的操作:

INSERT INTO dbo.men_txn ("VALUE", begin_date, end_date, created_by, created_date, modified_by, modified_date)
WITH dts (dt) AS (SELECT to_date('01/01/2010', 'dd/mm/yyyy')
                  FROM   dual
                  UNION ALL
                  SELECT add_months(dt, 1)
                  FROM   dts
                  WHERE  add_months(dt, 1) <= add_months(to_date('01/01/2010', 'dd/mm/yyyy'), 12))
SELECT 'RGLR' val,
       dt month_start,
       last_day(dt) month_end,
       'admin',
       SYSDATE,
       'admin',
       SYSDATE
FROM   dts;

注意:我假设您能够确定如何指定开始日期以及要生成日期列表的月份。
另请注意,在Oracle中,DATE格式包含时间元素,因此,如果您使用dbo.men_txn表与其他日期进行比较,请记住这一点-例如,如果您查询2022年1月1日到2022年1月31日之间的日期,则将丢失日期在2022年1月31日午夜之后的行。

相关问题