动态Oracle过程 - 结构问题

时间:2016-05-26 13:24:26

标签: sql oracle

我似乎在创建存储过程时遇到了一些问题,而我根本无法看到问题所在。我对Oracle比较陌生。

我有一张未知长度的表。我所做的是我创建了一个存储过程,它将创建一个表格,表格的行数是我获取值的表格的宽度。即如果表有10个值,则代码将创建一个10列宽的新表等。

我设法让初始代码正常工作,但现在我试图添加一些额外的逻辑而没有成功。

我想要完成的逻辑是这样的:

如果表格不存在 - 创建它

IF TABLE EXSITS - SIMPLY INSERT IN IT

我还没有为INSERT部分创建代码,因为我无法让第一部分工作。一切都工作正常,直到我添加了计数和IF语句。

    CREATE OR REPLACE PROCEDURE "MDWPROD"."WORKFLOW_VAR_PIVOT" IS
    v_sql varchar2(32767);

    -- for the first run ofthe procedure, we need to create the table
    DECLARE var_count INT;

    SELECT 
        COUNT(*) 
    INTO 
        var_count
    FROM 
        all_tables 
    WHERE 
        OWNER = 'MDWPROD'
        AND TABLE_NAME = 'RBI_PROCESSVARIABLE_WK';


    -- if var_count = 0 then the table does not exists, create it, otherwise proceed with other logic
    IF var_count = 0 THEN

        -- cursor to find out the maximum number of projected columns required
        CURSOR cur_proj_test IS
            SELECT DISTINCT 
                ID, 
                VARIABLE_REPORT_LBL
            FROM   
                MDWPROD.RBI_VARIABLETYPE_DM
            ORDER BY 
                ID;

         -- We now loop through the cursor, and build of the SQL string to CREATE and POPULATE the table 
        BEGIN
            v_sql := 'CREATE TABLE MDWPROD.RBI_PROCESSVARIABLE_WK AS SELECT VAR.PROCESS_ID';
            FOR i IN cur_proj_test
            LOOP

                -- dynamically add to the projection for the query
                v_sql := v_sql || ',MAX(CASE VT.VARIABLE_REPORT_LBL WHEN ''' || i.VARIABLE_REPORT_LBL || ''' THEN VAR.VALUE ELSE '''' END) AS "' || i.VARIABLE_REPORT_LBL || '"';

            END LOOP;

            v_sql := v_sql || ' FROM MDWPROD.RBI_VARIABLE_DM VAR INNER JOIN MDWPROD.RBI_VARIABLETYPE_DM VT ON VAR.VARIABLE_TYPE_ID = VT.ID WHERE VAR.CURRENT_IND = ''Y'' GROUP BY VAR.PROCESS_ID order by VAR.PROCESS_ID';

             -- Create table and populate it with all the relevant variable values
            EXECUTE IMMEDIATE v_sql;
        END;


    END IF;
END;

非常感谢任何协助。

原始工作程序:

CREATE OR REPLACE PROCEDURE WORKFLOW_VAR_PIVOT IS
    v_sql varchar2(32767);


    -- cursor to find out the maximum number of projected columns required
    CURSOR cur_proj_test IS
        SELECT DISTINCT 
            ID, 
            VARIABLE_REPORT_LBL
        FROM   
            MDWPROD.RBI_VARIABLETYPE_DM
        ORDER BY 
            ID;

     -- We now loop through the cursor, and build of the SQL string to CREATE and POPULATE the table 
    BEGIN
        v_sql := 'CREATE TABLE MDWPROD.RBI_PROCESSVARIABLE AS SELECT VAR.PROCESS_ID';
        FOR i IN cur_proj_test
        LOOP

            -- dynamically add to the projection for the query
            v_sql := v_sql || ',MAX(CASE VT.VARIABLE_REPORT_LBL WHEN ''' || i.VARIABLE_REPORT_LBL || ''' THEN VAR.VALUE ELSE '''' END) AS "' || i.VARIABLE_REPORT_LBL || '"';

        END LOOP;

        v_sql := v_sql || ' FROM MDWPROD.RBI_VARIABLE_DM VAR INNER JOIN MDWPROD.RBI_VARIABLETYPE_DM VT ON VAR.VARIABLE_TYPE_ID = VT.ID WHERE VAR.CURRENT_IND = ''Y'' GROUP BY VAR.PROCESS_ID order by VAR.PROCESS_ID';

        -- un comment this line to print out the entire SQL statement
        -- dbms_output.put_line('Dynamic SQL Statement:-' || chr(10) || v_sql || chr(10) || chr(10));

        -- DROP TABLE before recreating it
        EXECUTE IMMEDIATE 'DROP TABLE MDWPROD.RBI_PROCESSVARIABLE';

        -- Create table and populate it with all the relevant variable values
        EXECUTE IMMEDIATE v_sql;
    END;

1 个答案:

答案 0 :(得分:1)

可能还有其他问题(您从未说过确切的错误),但我可以立即看到begin关键字位于错误的位置。您的声明应位于begin关键字之前的顶部,并且您的执行语句应该在之后。

我把事情搞砸了一下。这可以让你更接近目标:

CREATE OR REPLACE PROCEDURE "MDWPROD"."WORKFLOW_VAR_PIVOT" IS
    v_sql varchar2(32767);

    -- for the first run ofthe procedure, we need to create the table
    DECLARE var_count INT;

    -- cursor to find out the maximum number of projected columns required
    CURSOR cur_proj_test IS
        SELECT DISTINCT 
            ID, 
            VARIABLE_REPORT_LBL
        FROM   
            MDWPROD.RBI_VARIABLETYPE_DM
        ORDER BY 
            ID;

BEGIN

    SELECT 
        COUNT(*) 
    INTO 
        var_count
    FROM 
        all_tables 
    WHERE 
        OWNER = 'MDWPROD'
        AND TABLE_NAME = 'RBI_PROCESSVARIABLE_WK';


    -- if var_count = 0 then the table does not exists, create it, otherwise proceed with other logic
    IF var_count = 0 THEN


         -- We now loop through the cursor, and build of the SQL string to CREATE and POPULATE the table 
            v_sql := 'CREATE TABLE MDWPROD.RBI_PROCESSVARIABLE_WK AS SELECT VAR.PROCESS_ID';
            FOR i IN cur_proj_test
            LOOP

                -- dynamically add to the projection for the query
                v_sql := v_sql || ',MAX(CASE VT.VARIABLE_REPORT_LBL WHEN ''' || i.VARIABLE_REPORT_LBL || ''' THEN VAR.VALUE ELSE '''' END) AS "' || i.VARIABLE_REPORT_LBL || '"';

            END LOOP;

            v_sql := v_sql || ' FROM MDWPROD.RBI_VARIABLE_DM VAR INNER JOIN MDWPROD.RBI_VARIABLETYPE_DM VT ON VAR.VARIABLE_TYPE_ID = VT.ID WHERE VAR.CURRENT_IND = ''Y'' GROUP BY VAR.PROCESS_ID order by VAR.PROCESS_ID';

             -- Create table and populate it with all the relevant variable values
            EXECUTE IMMEDIATE v_sql;
    END IF;
END;