【发布时间】:2019-12-24 18:04:52
【问题描述】:
我想创建一个存储过程,它接受表名作为参数并在过程中动态传递它。例如:我想将表名 'DATA.WORK_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
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:无效的主机/绑定变量名
【问题讨论】:
-
oracle != sql-server != mysql
-
我已经删除了所有冲突的标签。请正确标记。
-
@Uueerdo 。 . .是的,但您只会在使用 Oracle 时遇到 Oracle 错误。
-
您可能有太多引号或其他一些语法错误。打印出字符串并手动执行它,看看它是什么样子的
标签: oracle plsql dynamic-sql