【问题标题】:Dynamically use select into statement动态使用 select into 语句
【发布时间】:2016-01-06 09:31:08
【问题描述】:

下面的函数有什么问题?

create or replace function getNameById(myId in number) return number
is
  query varchar2(500);
  myName varchar2(20);
begin


  query :='SELECT users_name INTO :myname FROM USERS_TABLE WHERE USERS_ID = :myid';

  execute 
  immediate query 
  USING out myName, myId;

  dbms_output.put_line(myName);
  return(myName);
end getNameById;

如果我使用的不是查询:

SELECT users_name INTO myName FROM USERS_TABLE WHERE USERS_ID = 81;

但是执行成功了

问题是当我添加“ INTO :myname ”时,我在执行时遇到错误..

做动态sql的时候不能用INTO吗?

编辑:已解决!

create or replace function getNameById(myId in number) return varchar2
is
  query varchar2(500);
  myName users_table.users_name%type;

begin

  query :='SELECT users_name FROM USERS_TABLE WHERE USERS_ID = :myid'; 
  execute immediate query INTO myName USING myId;

  dbms_output.put_line(myName);
  return(myName);

end getNameById;

【问题讨论】:

    标签: plsql


    【解决方案1】:

    您不需要在 select 语句中使用 into

    create or replace function getNameById(myId in number) return number
    is
        query varchar2(500);
        myName varchar2(20);
        rezult varchar(100);
    begin
    
        query :='SELECT users_name FROM USERS_TABLE WHERE USERS_ID = '||myid;
    
            execute 
            immediate query 
            into rezult;
    
      dbms_output.put_line(rezult);
      return(rezult);
    end getNameById;
    

    【讨论】:

      【解决方案2】:

      您不能在 Oracle 动态 SQL 中绑定表名。您需要将表名直接放入动态 SQL 中。请尝试改用以下存储过程:

      CREATE OR REPLACE PROCEDURE getNameById (
         myName IN VARCHAR2,
         myId IN NUMBER) AS
         where_clause VARCHAR2(100) := ' WHERE USERS_ID = ' || myId;
      BEGIN
         EXECUTE IMMEDIATE 'SELECT users_name INTO ' || myname || ' FROM USERS_TABLE' || where_clause;
      END;
      

      阅读herehere 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-18
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多