Plsql 如何在动态sql中使用OUT模式

Plsql 如何在动态sql中使用OUT模式,plsql,dynamic-sql,execute-immediate,Plsql,Dynamic Sql,Execute Immediate,这就是我要做的 1 declare 2 stmt VARCHAR2(200):='&query'; 3 emprec emp%ROWTYPE; 4 BEGIN 5 EXECUTE IMMEDIATE stmt USING out emprec,in &id; 6 DBMS_OUTPUT.PUT_LINE('Emp: '||emprec.ename); 7* END; SQL> / Enter value for query:

这就是我要做的

  1  declare
  2  stmt VARCHAR2(200):='&query';
  3  emprec emp%ROWTYPE;
  4  BEGIN
  5    EXECUTE IMMEDIATE stmt USING out emprec,in &id;
  6    DBMS_OUTPUT.PUT_LINE('Emp: '||emprec.ename);
  7* END;
SQL> /
Enter value for query: select * into :emprec from emp where empno=:no
old   2: stmt VARCHAR2(200):='&query';
new   2: stmt VARCHAR2(200):='select * into :emprec from emp where empno=:no';
Enter value for id: 7369
old   5:   EXECUTE IMMEDIATE stmt USING out emprec,in &id;
new   5:   EXECUTE IMMEDIATE stmt USING out emprec,in 7369;
  EXECUTE IMMEDIATE stmt USING out emprec,in 7369;
                                   *
ERROR at line 5:
ORA-06550: line 5, column 36:
PLS-00457: expressions have to be of SQL types
ORA-06550: line 5, column 3:
PL/SQL: Statement ignored
但是,当我将第5行更改为

使用in&id在emprec中执行即时stmt

然后查询
从emp中选择*,其中empno=:no


然后它工作正常,并显示正确的输出。任何人请帮助我,如何解决这个问题

要存储已执行查询的结果集,您必须使用INTO子句指定一个兼容的变量

DECLARE
  stmt VARCHAR2(200):='select * from emp where empno=:no';
  emprec emp%ROWTYPE;
BEGIN
  EXECUTE IMMEDIATE stmt INTO emprec USING &id;
  DBMS_OUTPUT.PUT_LINE('Emp: '||emprec.ename);
END;
INTO子句仅用于单行查询,该子句指定检索列值的变量或记录。对于查询检索到的每个值,INTO子句中必须有一个对应的、类型兼容的变量或字段

DECLARE
  stmt VARCHAR2(200):='select * from emp where empno=:no';
  emprec emp%ROWTYPE;
BEGIN
  EXECUTE IMMEDIATE stmt INTO emprec USING &id;
  DBMS_OUTPUT.PUT_LINE('Emp: '||emprec.ename);
END;

您是否尝试过使用
RETURNING
子句?