如何在存储过程-ORACLE中动态传递表名
我希望创建一个存储过程,使其接受表名作为参数,并在过程中动态传递它。例如:我想将表名“DATA.WORK\u CPG”作为参数传递给存储过程 以下是实际操作过程如何在存储过程-ORACLE中动态传递表名,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我希望创建一个存储过程,使其接受表名作为参数,并在过程中动态传递它。例如:我想将表名“DATA.WORK\u CPG”作为参数传递给存储过程 以下是实际操作过程 create or replace PROCEDURE Proc_Sample ( ApplicationID IN varchar2, CType IN varchar2, WBName IN varchar2, WBList OUT SYS_REFCURSOR )AS BEGIN OPEN WBList FOR SELE
create or replace PROCEDURE Proc_Sample
(
ApplicationID IN varchar2,
CType IN varchar2,
WBName IN varchar2,
WBList OUT SYS_REFCURSOR
)AS
BEGIN
OPEN WBList
FOR
SELECT
WO.RECORDNUMBER AS RECORDNUMBER,
FROM DATA.ASSIGN_WB WB
INNER JOIN DATA.WORK_CPG WO ON WO.PZINSKEY = WB.PXREFOBJECTKEY
INNER JOIN COMMON.REF_APPLICATION RA ON RA.APPLICATIONNAME = WB.PXAPPLICATION
WHERE RA.APPLICATIONID = ApplicationID AND WB.ASSIGNEDID IN ( select regexp_substr(WBName,'[^,]+', 1, level) from dual
connect by regexp_substr(WBName, '[^,]+', 1, level) is not null );
END Proc_Sample;
我尝试将表名作为参数传递给存储过程,如下所示对其进行转换
create or replace PROCEDURE Proc_Sample
(
TableName in varchar2,
ApplicationID IN varchar2,
CaseType IN varchar2,
WBName IN varchar2,
WBList OUT SYS_REFCURSOR
)AS
stmt varchar2(10000);
BEGIN
--OPEN WBList
--FOR
stmt := ' SELECT
WO.RECORDNUMBER AS RECORDNUMBER,
FROM DATA.PC_ASSIGN_WB WB
INNER JOIN ' || TableName || ' WO ON WO.PZINSKEY = WB.PXREFOBJECTKEY
INNER JOIN COMMON.REF_APPLICATION RA ON RA.APPLICATIONNAME = WB.PXAPPLICATION
WHERE RA.APPLICATIONID = ApplicationID AND WB.ASSIGNEDID IN (select regexp_substr(''' || WBName || ''',''[^,]+'', 1, level) from dual
connect by regexp_substr(''' || WBName || ''', ''[^,]+'', 1, level) is not null)';
--execute immediate stmt;
open WBList for stmt;
END Proc_Sample;
这样做正确吗?
注意-程序已成功编译。
错误:
当从客户端应用程序执行此操作时,我得到以下错误
ORA-01745:无效的主机/绑定变量名我更喜欢使用绑定变量:
create or replace PROCEDURE Proc_Sample
(
TableName in varchar2,
ApplicationID IN varchar2,
CaseType IN varchar2,
WBName IN varchar2,
WBList OUT SYS_REFCURSOR
)AS
stmt varchar2(10000);
BEGIN
--OPEN WBList
--FOR
stmt := ' SELECT
WO.RECORDNUMBER AS RECORDNUMBER,
FROM DATA.PC_ASSIGN_WB WB
INNER JOIN ' || TableName || ' WO ON WO.PZINSKEY = WB.PXREFOBJECTKEY
INNER JOIN COMMON.REF_APPLICATION RA ON RA.APPLICATIONNAME = WB.PXAPPLICATION
WHERE RA.APPLICATIONID = ApplicationID AND WB.ASSIGNEDID IN (select regexp_substr(''' || WBName || ''',''[^,]+'', 1, level) from dual
connect by regexp_substr(''' || WBName || ''', ''[^,]+'', 1, level) is not null)';
--execute immediate stmt;
open WBList for stmt;
END Proc_Sample;
SQL> CREATE OR REPLACE PROCEDURE Proc_Sample(ApplicationID varchar2,
--CType varchar2,
WBName varchar2,
RecNum OUT DATA.WORK_CPG.RECORDNUMBER%type ) AS
WBList sys_refcursor;
stmt varchar2(10000);
BEGIN
stmt := 'SELECT WO.RECORDNUMBER AS RECORDNUMBER
FROM DATA.ASSIGN_WB WB
INNER JOIN DATA.WORK_CPG WO
ON WO.PZINSKEY = WB.PXREFOBJECTKEY
INNER JOIN COMMON.REF_APPLICATION RA
ON RA.APPLICATIONNAME = WB.PXAPPLICATION
WHERE RA.APPLICATIONID = :AppID
AND WB.ASSIGNEDID IN
(SELECT regexp_substr(:WBN, ''[^,]+'', 1, level)
FROM dual
CONNECT BY regexp_substr(:WBN, ''[^,]+'', 1, level) is not null)';
OPEN WBList FOR stmt USING ApplicationID, WBName, WBName;
FETCH WBList INTO RecNum;
CLOSE WBList;
END Proc_Sample;
/
无论何时调用RecNum,查询的第一个返回值都将为out:
SQL> SET SERVEROUTPUT ON
SQL> Declare
rcn DATA.WORK_CPG.RECORDNUMBER%type;
Begin
Proc_Sample(118,'abc',rcn);
Dbms_Output.Put_Line(rcn);
End;
/
如果你的目标只是打印出所有返回的记录,那么
替换
将WBList提取到RecNum中代码>
与
在过程中。oracle!=sql server!=mysqlI已经删除了所有冲突的标签。请正确标记。@uuerdo。是的,但是Oracle只会出现Oracle错误。您可能有太多的引号或其他语法错误。打印出字符串并手动执行,然后查看响应的外观。一个简单的问题,这些绑定变量:AppID和:WBN是如何派生的。在查询右侧的任何位置都没有设置它们。请原谅@daks,WBName应该重复,因为它们是通过打开WBList FOR stmt设置的,使用ApplicationID、WBName、WBName
,并在字符串中使用绑定变量(:AppID,:WBN,:WBN
)的数量和出现顺序。我已经修好了。