用于从Oracle中的表中选择所有行的存储过程

时间:2018-01-31 05:27:25

标签: asp.net oracle stored-procedures

请注意:有几篇关于此的帖子,但由于某些关键词而导致我使用的原因是什么? 如何在Oracle中创建一个简单的存储过程,从而选择表中的所有行。我想要创建与SQL中编写的下面脚本相同的内容。另外,如何在Oracle中执行该过程并放在ASP.NET OracleCommand对象中。

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

CREATE PROCEDURE spGetData
AS
Begin
SELECT * from My_Table;
End

执行是sql

execute spGetData

3 个答案:

答案 0 :(得分:3)

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

要在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;

感谢。

答案 1 :(得分: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>

答案 2 :(得分:0)

  
    

您必须根据相应的列声明某个变量,只声明您想要的感兴趣的列

  
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;