oracle – 带有动态SQL语句的Cursor For Loop
发布时间:2021-02-08 04:18:59 所属栏目:站长百科 来源:网络整理
导读:有没有办法用动态SQL语句执行Cursor For循环? 如果我不想声明一条记录,我可以这样做(只有当我声明了光标..): For I in cuSelect Loop dbms_output.put_line(I.NAME);End Loop; 我可以打开一个动态SQL语句的游标: Open cuSelect For 'Select * From TAB_X'
|
有没有办法用动态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 例如: 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;
(编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

