oracle dbms_sql.native和批量收集

jk9hmnmh  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(147)

使用dbms_sql时是否可以从对象表中进行选择。native?我定义了一个对象:

CREATE OR REPLACE TYPE SI_O IS OBJECT(
    S_ID   NUMBER, 
    P_ID   NUMBER, 
    G_ID   NUMBER,   
    DLT    VARCHAR2(255), 
    ERROR_ID NUMBER,
    B_ID   NUMBER
);

我还定义了一个对象表:

create or replace type SI_T is table of si_o;

现在我试着在这样的程序中使用它:

CREATE OR REPLACE PROCEDURE NATIVE_TEST IS
sqlCommand VARCHAR2(320);
tRows SI_T;
num BINARY_INTEGER:= -1;
l_ntt_desc_tab DBMS_SQL.DESC_TAB;
cur INTEGER;
cnt   INTEGER;
nrowCnt   INTEGER;

BEGIN   
    
    sqlCommand := 
    '  SELECT SI_O(S_ID, P_ID, G_ID,   DLT, error_id,B_ID) FROM MYTABLE' ;      
    
     EXECUTE IMMEDIATE sqlCommand BULK COLLECT INTO tRows ;
     sqlCommand := 'select count(*) cou from table(tRows)';
     -- here is what I wish:         
     cur := DBMS_SQL.OPEN_CURSOR;
     
    DBMS_SQL.PARSE(cur,sqlCommand,dbms_sql.native);
    nrowCnt:=DBMS_SQL.EXECUTE(cur);
    DBMS_SQL.CLOSE_CURSOR(cur);
END NATIVE_TEST;

然而,我得到运行时异常ora-00904“TROWS”无效标识符。这里的一切都很简单,但我真的希望使用dbms_sql。像这样的人(如果可能的话)。

nkkqxpd9

nkkqxpd91#

因此,trows是一个plsql表,它位于为plsql分配的内存中,而select只能对数据库中的对象进行操作。不需要运行SQL语句来获取PLSQL表的计数。你只是有trows。count属性,您可以在定义trows的pl/sql块中调用该属性。

相关问题