过程中类型的可见性(pl/sql)

问题描述 投票:0回答:1

我的 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;

它适用于本地程序。但是,如果我创建一个过程并从另一个上下文中调用它,我会收到错误“该表不存在”。

我尝试了互联网上采取的不同解决方案,但没有一个有效

plsql procedure bulk-collect
1个回答
0
投票

您必须将输出数据转换为您的对象。

我能够在本地数据库重现您的错误。

我刚刚使用了你类型的构造函数,它起作用了:

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;  
© www.soinside.com 2019 - 2024. All rights reserved.