【问题标题】:select statement not working in procedure选择语句在过程中不起作用
【发布时间】:2014-03-11 07:18:33
【问题描述】:
create table Employee(Id number,
                  Name varchar(20),
                  Age number,
                  DId number,
                  Salary number,
         primary key(Id),
         foreign key(DId) references Department on delete cascade);

declare
  total number;
  procedure myFunction(x in number) is 
     begin
       insert into Employee values(17,'Jaskaran Singh',31,1,200000);
       dbms_output.put_line('successfully executed');
       select * from Employee;
      end;
   begin
     myFunction(3);
   end;

【问题讨论】:

  • 你想达到什么目的?您执行了 select 却没有返回它或以任何方式使用它的数据。
  • 我只想打印数据
  • 参考这个链接stackoverflow.com/questions/6029802/…关于如何在过程/函数中使用select
  • @mohitsahu 所以你应该遍历结果并dbms_output他们。

标签: sql oracle plsql


【解决方案1】:

要从存储过程中返回数据,您应该创建一个游标并返回该选择,如下所示:

CREATE OR REPLACE PACKAGE TYPES
AS
   TYPE DATA_CURSOR IS REF CURSOR;
END;

那么在你的代码中会是这样的:

CREATE OR REPLACE PROCEDURE MYPROC(RESULTSET OUT TYPES.DATA_CURSOR)  AS
   BEGIN
       INSERT INTO EMPLOYEE VALUES(17,'Jaskaran Singh',31,1,200000);
       DBMS_OUTPUT.PUT_LINE('successfully executed');

    OPEN RESULTSET FOR
      SELECT * FROM EMPLOYEE;
      END;

执行部分像

DECLARE THE_RESULT_SET OUT TYPES.DATA_CURSOR;
   BEGIN
     MYPROC(3, THE_RESULT_SET);
    --     You can now get the THE_RESULT_SET and take the result from it...
   END;

重要提示:如果您想按照我理解的另一种情况进行打印,您可以获得该结果(相同的代码),然后循环您想要的任何内容并从 THE_RESULT_SET 打印结果

【讨论】:

    【解决方案2】:

    如果您想打印 EMPLOYEES 表中的内容,您可以在 EMPLOYEES 表上循环游标,从而适当地打印每一行。这是一个例子:

    DECLARE
      TOTAL NUMBER;
    
      PROCEDURE MYFUNCTION(X IN NUMBER) IS 
        BEGIN
          INSERT INTO EMPLOYEE VALUES(17,'Jaskaran Singh',31,1,200000);
          DBMS_OUTPUT.PUT_LINE('successfully executed');
    
          FOR aRow IN (SELECT * FROM EMPLOYEE) LOOP
            DBMS_OUTPUT.PUT_LINE('ID=' || aRow.ID ||
                                 ' NAME=''' || aRow.NAME || '''' ||
                                 ' AGE=' || aRow.AGE ||
                                 ' DID=' || aRow.DID ||
                                 ' SALARY=' || aRow.SALARY);
          END LOOP;
      END;
    BEGIN
      MYFUNCTION(3);
    END;
    

    分享和享受。

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 2018-09-19
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多