有没有办法用动态sql语句执行Cursor For循环?
如果我不想声明一条记录,我可以这样做(只有当我声明了光标..):
For I in cuSelect Loop dbms_output.put_line(I.NAME); End Loop;
我可以打开一个动态sql语句的游标:
Open cuSelect For 'Select * From TAB_X'; Fetch ceSelect Into recSelect; Close cuSelect;
但要做到这一点,我必须首先声明记录.
现在我的问题是我必须为一个非常大而复杂的动态sql语句打开Cursor.记录的结构是未知的.有没有办法打开一个变量光标并用“未声明”记录迭代它?
解决方法
我认为你可以用DBMS_sql包做你想做的事.
你也可以看看这些:
> Using Dynamic SQL
> COLUMN_VALUE Procedure
例如:
declare TYPE curtype IS REF CURSOR; src_cur curtype; curid NUMBER; namevar VARCHAR2(50); numvar NUMBER; datevar DATE; desctab DBMS_sql.DESC_TAB; colcnt NUMBER; dsql varchar2(1000) := 'select card_no from card_table where rownum = 1'; begin OPEN src_cur FOR dsql; -- Switch from native dynamic sql to DBMS_sql package. curid := DBMS_sql.TO_CURSOR_NUMBER(src_cur); DBMS_sql.DESCRIBE_COLUMNS(curid,colcnt,desctab); -- Define columns. FOR i IN 1 .. colcnt LOOP IF desctab(i).col_type = 2 THEN DBMS_sql.DEFINE_COLUMN(curid,i,numvar); ELSIF desctab(i).col_type = 12 THEN DBMS_sql.DEFINE_COLUMN(curid,datevar); ELSE DBMS_sql.DEFINE_COLUMN(curid,namevar,50); END IF; END LOOP; -- Fetch rows with DBMS_sql package. WHILE DBMS_sql.FETCH_ROWS(curid) > 0 LOOP FOR i IN 1 .. colcnt LOOP IF (desctab(i).col_type = 1) THEN DBMS_sql.COLUMN_VALUE(curid,namevar); dbms_output.put_line(namevar); ELSIF (desctab(i).col_type = 2) THEN DBMS_sql.COLUMN_VALUE(curid,numvar); dbms_output.put_line(numvar); ELSIF (desctab(i).col_type = 12) THEN DBMS_sql.COLUMN_VALUE(curid,datevar); dbms_output.put_line(datevar); END IF; END LOOP; END LOOP; DBMS_sql.CLOSE_CURSOR(curid); end;