我们已经创建了 Oracle 表类型。我们已经创建了一个数组。这样做是因为我们不知道可以有多少值,这对于 sql 查询中的 IN 子句来说可能太多了。
--代码片段-----
create or replace
TYPE "INPUTCODE"
as object
(pc varchar2(100) )
create or replace
TYPE "INPUTCODEARR"
IS TABLE OF inputcode;
create or replace
PROCEDURE "TEST_PROC" (testCodes IN inputcodeArr, timeHorizon IN NUMBER, p_recordset OUT SYS_REFCURSOR)
AS
var_sqlStmt VARCHAR2(4096);
BEGIN
var_sqlStmt := 'select t.a,t.b, t.c';
var_sqlStmt := var_sqlStmt || 'from test t';
if testCodes is not null then
var_sqlStmt := var_sqlStmt || ', table(testCodes) tc';
var_sqlStmt := var_sqlStmt || 'where tc.pc = t.name';
end if;
dbms_output.put_line('Final SQL Statement::' || var_sqlStmt);
open p_recordset for var_sqlStmt;
END TEST_PROC;
上面所有的都是编译的,当您使用很少的 testCode 值运行 TEST_PROC 过程时,它将失败并出现错误 Invalid identifier for testCodes。
在该过程中,在我的控制台中打印的最终 sql 语句是正确的,当您在过程中将其作为静态 sql 语句运行时,它运行时没有任何错误。但是在动态sql里面它失败了。我尝试使用 DYNAMIC_SQL 包执行,但会导致相同的错误。另外,我尝试将其作为“表(testCodes)”的绑定变量。那也失败了。
请建议。