请注意:有几篇关于此的帖子,但由于某些关键词而导致我使用的原因是什么?
如何在Oracle
中创建一个简单的存储过程,从而选择表中的所有行。我想要创建与SQL
中编写的下面脚本相同的内容。另外,如何在Oracle中执行该过程并放在ASP.NET
OracleCommand
对象中。
如何在Oracle中重写此SQL存储过程
CREATE PROCEDURE spGetData
AS
Begin
SELECT * from My_Table;
End
执行是sql
execute spGetData
答案 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;