【问题标题】:stored procedure for selecting all rows from table in OracleOracle中从表中选择所有行的存储过程
【发布时间】:2018-07-10 03:24:41
【问题描述】:

请注意:有几篇关于此的帖子,但由于一些关键词,我没有得到这些帖子,为什么要使用? 如何在Oracle 中创建一个简单的存储过程,从表中选择所有行。我完全想创建与下面用SQL 编写的脚本相同的脚本。还有如何在Oracle中执行该过程并放入ASP.NETOracleCommand对象。

如何在Oracle中重写这个SQL存储过程

CREATE PROCEDURE spGetData
AS
Begin
SELECT * from My_Table;
End

执行是sql

execute spGetData

【问题讨论】:

    标签: asp.net oracle stored-procedures


    【解决方案1】:

    没有太多的声誉,所以不要评论添加答案。

    要在Oracle中编写存储过程,选择所有需要包含refcursor的行,作为游标,它将作为指针并一一指向oracle结果集并给出结果。

    Oracle 的存储过程

    CREATE OR REPLACE PROCEDURE spGetData(cursorParam OUT SYS_REFCURSOR)
     IS
      BEGIN
       OPEN cursorParam FOR
        SELECT * from My_Table;
    END ;
    

    并执行它你需要oracle

       var c refcursor;
        execute spGetData(:c)
       print c;
    

    对 ASP.NET 了解不多,但可能需要添加游标参数

      OracleCommand.Parameters.Add("cursorParam ", OracleType.Cursor).Direction =
    ParameterDirection.Output;
    

    谢谢。

    【讨论】:

    • 在我看来,这答案而不是评论,所以我不会担心。
    • 在执行时打开一个要求输入值的窗口,看起来是参数。如果我提供或不提供任何值,它会给出无效的错误
    • cursorParam 是 OUT 类型的参数它不是 IN 参数,它不应该要求输入,可能是你做错了什么。
    【解决方案2】:

    Oracle 12c 有一个新功能Implicit Statement Results,只需要对过程进行一些更改:

    SQL> create table My_Table as select 1 a from dual;
    
    Table created.
    
    SQL> CREATE PROCEDURE spGetData
      2  AS
      3     c1 sys_refcursor;
      4  Begin
      5     open c1 for
      6     SELECT * from My_Table;
      7
      8     dbms_sql.return_result(c1);
      9  End;
     10  /
    
    Procedure created.
    
    SQL> execute spGetData
    
    PL/SQL procedure successfully completed.
    
    ResultSet #1
    
             A
    ----------
             1
    
    SQL>
    

    【讨论】:

      【解决方案3】:

      你必须要根据你适当的列声明一些变量,只声明你想要的感兴趣的列

      CREATE PROCEDURE spGetData
      AS
      v_emp_id number(20);
      v_ename varchar2(20);
      Begin
      SELECT emp_id,ename into v_emp_id,v_ename from My_Table;
      End;
      

      我认为您的错误一定是在声明中? 所以试试这个

      DECLARE
      TYPE EMP_USER_TYPE IS RECORD (
       EMP_ID        VARCHAR2(10),
      emp_name        VARCHAR2(10)
      );
      TYPE emp_user_tab IS TABLE OF emp_user_type;
      emp_user_rec emp_user_tab;
      BEGIN
      SELECT emp_id,emp_name
      BULK COLLECT INTO emp_user_rec
      FROM test_employee;
      FOR i IN emp_user_rec.FIRST .. emp_user_rec.LAST LOOP
      dbms_output.put_line( emp_user_rec(i).emp_id || ', ' || 
      emp_user_rec(i).emp_name );
      END LOOP;
      END;
      

      【讨论】:

      • 我的栏目很多,为什么要一一声明,我要全部显示。
      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2015-05-02
      • 2022-07-21
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多