过程体

时间:2015-10-27 10:48:53

标签: sql plsql cursor oracle12c

我试图在过程体内声明一个游标。 我知道它应该在声明块中完成,但是光标引用的表是在过程体内创建的。

--TABLE MAY OR MAY NOT BE PRESENT PRIOR TO PROCEDURE EXECUTION
SELECT COUNT(*)
  INTO ln_cnt
  FROM User_Tables
  WHERE table_name = 'TMP$UOM_COMBO_GEN';
  IF ln_cnt > 0 THEN
    EXECUTE IMMEDIATE ' CREATE TABLE TMP$UOM_COMBO_GEN (UOM_ID VARCHAR2(20 BYTE), HIER_CODE VARCHAR2(20 BYTE),NODE_CODE VARCHAR2(200 BYTE))';
  END IF;

  CURSOR C_HIER
  IS
    SELECT DISTINCT HIER_CODE FROM TMP$UOM_COMBO_GEN WHERE UOM_ID=P_UOM_ID;

 FOR HIER IN C_HIER
  LOOP
    IF C_HIER%ROWCOUNT = 1 THEN
      LV_SQL2         := '(SELECT UOM_ID, NODE_CODE '||HIER.HIER_CODE||' FROM TMP$UOM_COMBO_GEN WHERE UOM_ID='''||P_UOM_ID||''' AND HIER_CODE='''||HIER.HIER_CODE||''')'||HIER.HIER_CODE;
      LV_SORT         := ' ORDER BY '||HIER.HIER_CODE||'';
      LV_SQL          := 'SELECT * FROM ' || LV_SQL2;
    ELSE
      LV_SQL3 := ' LEFT OUTER JOIN(SELECT NODE_CODE '||HIER.HIER_CODE||' FROM TMP$UOM_COMBO_GEN WHERE UOM_ID='''||P_UOM_ID||''' AND HIER_CODE='''||HIER.HIER_CODE||''')'||HIER.HIER_CODE ||' ON 1=1';
      LV_SORT := LV_SORT||','||HIER.HIER_CODE||'';
      LV_SQL  := LV_SQL || LV_SQL3;
    END IF;
  END LOOP;

我收到以下错误。

  

错误(17,10):PLS-00103:遇到以下其中一项时遇到符号“C_HIER”:: =。 (@%;

1 个答案:

答案 0 :(得分:0)

一旦创建的表存储在数据库中,您可以从您想要在模式中引用的任何位置引用它。

此外,您的代码可能需要在以下部分中进行更改

        SELECT COUNT(*)
          INTO ln_cnt
          FROM User_Tables
          WHERE table_name = 'TMP$UOM_COMBO_GEN';
          IF ln_cnt > 0 THEN -- means only if table exists u want to create the table which will 
         --throw an exception if table is already there , 
         --so better equate it to 0
            EXECUTE IMMEDIATE ' CREATE TABLE TMP$UOM_COMBO_GEN (UOM_ID VARCHAR2(20 BYTE), HIER_CODE VARCHAR2(20 BYTE),NODE_CODE VARCHAR2(200 BYTE))';
          END IF;

现在,如果你确实需要在每次某些条件为true / false时创建一个新表,那么你想要在游标中选择表,使用引用游标执行类似的操作

        create or replace procedure abc(Table_name varchar2 , param_list varchar2 , where_clause varchar2) is
        c_hier sys_refcursor ;
        LV_SQL2 varchar2(2000) ;
        LV_SORT varchar2(2000) ;
        LV_SQL varchar2(2000) ;
        LV_SQL3 varchar2(2000) ;
        begin
        SELECT COUNT(*)
          INTO ln_cnt
          FROM User_Tables
          WHERE table_name = Table_name; -- Use any table here 
          IF ln_cnt = 0 THEN
            EXECUTE IMMEDIATE ' CREATE TABLE '||Table_name||' '||param_list;
            END IF;

          open c_hier for 'SELECT DISTINCT '||param_list||' FROM '||table_name||' '||where_clause; 

         FOR HIER IN C_HIER
          LOOP
            IF C_HIER%ROWCOUNT = 1 THEN
              LV_SQL2         := '(SELECT UOM_ID, NODE_CODE '||HIER.HIER_CODE||' FROM TMP$UOM_COMBO_GEN WHERE UOM_ID='''||P_UOM_ID||''' AND HIER_CODE='''||HIER.HIER_CODE||''')'||HIER.HIER_CODE;
              LV_SORT         := ' ORDER BY '||HIER.HIER_CODE||'';
              LV_SQL          := 'SELECT * FROM ' || LV_SQL2;
            ELSE
              LV_SQL3 := ' LEFT OUTER JOIN(SELECT NODE_CODE '||HIER.HIER_CODE||' FROM TMP$UOM_COMBO_GEN WHERE UOM_ID='''||P_UOM_ID||''' AND HIER_CODE='''||HIER.HIER_CODE||''')'||HIER.HIER_CODE ||' ON 1=1';
              LV_SORT := LV_SORT||','||HIER.HIER_CODE||'';
              LV_SQL  := LV_SQL || LV_SQL3;
            END IF;
          END LOOP;