【发布时间】:2013-05-23 15:17:02
【问题描述】:
我对 db 没有经验,但我试图从存储过程的结果中获取列名。
代码必须是通用的,因为存储过程是未知的。
第一步是让它适用于没有输入参数的程序(只有 io_cursor)
到目前为止我的代码:
procedure fakeProc (
io_cursor in out t_ref_cursor
)
以及我正在使用的代码:
PROCEDURE get_SQL_Fields (
out_result out varchar2)
as
/**/
v_cur NUMBER := NULL;
v_count NUMBER := NULL;
v_tab_desc DBMS_SQL.DESC_TAB;
sqlstr VARCHAR2(100);
BEGIN
v_cur := DBMS_SQL.OPEN_CURSOR;
--Here i get errors
sqlstr :='begin '|| fakeproc()||';end;';
DBMS_SQL.PARSE(v_cur, sqlstr, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS(v_cur, v_count, v_tab_desc);
FOR i IN 1..v_count LOOP
out_result := out_result||v_tab_desc(i).COL_NAME||',';
END LOOP;
end if;
END get_SQL_Fields;
所以我现在的问题是构建这个 sqlstr ;
我得到的错误是:错误:PLS-00306:调用“FAKEPROC”时参数的数量或类型错误
线路:654
文本:sqlstr :='开始'|| fakeproc()||';end;';
错误:PL/SQL:语句被忽略 线路:654 文本:sqlstr :='开始'|| fakeproc()||';end;';
【问题讨论】:
-
好吧,即使这可能不是唯一的问题,
fakeProc需要一个t_ref_cursor parameter,而你调用它时不带参数... -
我知道。我试图在参数中放置一个 t_ref_cursor 但错误是绑定错误。
-
可能是重复的,但我不明白。如何使用 :open v_cur for select * from table(cast(v_tab as tab_type)); ?
-
您可以在尝试构建调用之前尝试使用 DBA_ARGUMENTS 来查找过程参数的名称和类型。分享和享受。