我的 pl/sql 过程有一些问题。
我正在尝试将查询 sql 中的记录结果集收集到 pl 数据集合中。 代码是这样的:
DECLARE
testProcedure TB_TESTPROCEDURETYPE;
sqlQuery VARCHAR2(1000);
BEGIN
sqlQuery := 'SELECT * FROM myTable FETCH FIRST 100 ROWS ONLY';
EXECUTE IMMEDIATE sqlQuery BULK COLLECT INTO testProcedure;
DBMS_OUTPUT.PUT_LINE(testProcedure.count);
END;
类型“TB_TESTPROCEDURETYPE”是对象“TESTPROCEDURETYPE”的表。 TESTPROCEDURETYPE 的结构与查询中的“myTable”相同。 这是我用来创建这些类型的方式:
CREATE OR REPLACE TYPE TESTPROCEDURETYPE AS OBJECT(
par1 VARCHAR2(50),
par2 VARCHAR2(2000),
par3 DATE,
par4 VARCHAR2(100),
CONSTRUCTOR FUNCTION TESTPROCEDURETYPE RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY TESTPROCEDURETYPE AS
CONSTRUCTOR FUNCTION TESTPROCEDURETYPE RETURN SELF AS RESULT IS
BEGIN
SELF.par1 := NULL;
SELF.par2 := NULL;
SELF.par3 := NULL;
SELF.par4 := NULL;
RETURN;
END;
END;
CREATE TYPE TB_TESTPROCEDURETYPE AS TABLE OF TESTPROCEDURETYPE;
如果我运行该程序,我会收到此错误:
Errore SQL [932] [42000]: ORA-00932: inconsistent datatypes: expected - got - ORA-06512: at line 9
有人可以帮忙吗?
注意:如果我不创建类型“TB_TESTPROCEDURETYPE”并且我尝试这种方式:
DECLARE
TYPE TB_TESTPROCEDURETYPE IS TABLE OF myTable%ROWTYPE;
testProcedure TB_TESTPROCEDURETYPE;
sqlQuery VARCHAR2(1000);
BEGIN
....
end;
它适用于本地程序。但是,如果我创建一个过程并从另一个上下文中调用它,我会收到错误“该表不存在”。
我尝试了互联网上采取的不同解决方案,但没有一个有效
您必须将输出数据转换为您的对象。
我能够在本地数据库重现您的错误。
我刚刚使用了你类型的构造函数,它起作用了:
DECLARE
testProcedure TB_TESTPROCEDURETYPE;
sqlQuery VARCHAR2(1000);
BEGIN
sqlQuery := 'SELECT TESTPROCEDURETYPE(par1,par2,par3,par4) FROM myTable FETCH FIRST 100 ROWS ONLY';
EXECUTE IMMEDIATE sqlQuery BULK COLLECT INTO testProcedure;
DBMS_OUTPUT.PUT_LINE(testProcedure.count);
END;