我正在寻找关于如何在SQL Developer或Embarcardero Rapid XE2中测试Oracle存储过程的一个很好的解释.谢谢.
我正在使用Postgresql 8.3并具有以下简单函数,它将返回refcursor 给客户端
CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
ref_cursor REFCURSOR;
BEGIN
OPEN ref_cursor FOR SELECT * FROM some_table;
RETURN (ref_cursor);
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但游标名称由PostgreSQL自动生成
BEGIN;
SELECT function_1(); --It will output the generated cursor name , for example , "<unnamed portal 11>" ;
FETCH 4 from "<unnamed portal 11>";
COMMIT;
Run Code Online (Sandbox Code Playgroud)
此外,明确声明游标名称作为函数的输入参数,如 38.7.3.5所述.返回游标.可以声明我自己的游标名称并使用此游标名称来操作返回的游标而不是Postgresql自动为我生成?如果没有,是否有任何命令可以获取生成的游标名称?
可能重复:
从oracle包过程中获取结果的最佳方法/工具
Oracle SQL Developer:在Grid中显示REFCURSOR结果?
我是Oracle SQL Developer的新手.我正在使用Oracle SQL Developer版本3.0.我试图使用以下查询来测试我的SP.
DECLARE
type output_cursor is ref cursor;
P_CURSOR output_cursor;
BEGIN
P_CURSOR := NULL;
myPackage.mySPTest ( P_NOTIFICATION_ID => 1975357,P_CURSOR => P_CURSOR) ;
END;
Run Code Online (Sandbox Code Playgroud)
当我在我的Oracle SQL Developer中运行上述查询时,我收到一条消息'anonymus block completed'并且没有显示任何结果.
任何人都可以帮助我,如何看到结果.
.
我试图将参考光标中的数据加载到表变量(或数组)中,如果表变量基于现有的%Rowtype但参考光标通过连接多个表来加载,则参考光标可以工作,所以让我试着演示一个例子我想做什么,有些人可以帮助我
--created table
create table SAM_TEMP(
col1 number null,
col2 varchar(100) null
);
--created procedure which outputs results from that table
CREATE OR REPLACE
PROCEDURE SP_OUT_RefCur_PARAM(
C_RESULT OUT SYS_REFCURSOR
) IS
BEGIN
OPEN C_RESULT FOR
SELECT COL1,COL2
FROM SAM_TEMP;
END SP_OUT_RefCur_PARAM;
--seeing the output works like this
DECLARE
REFCUR SYS_REFCURSOR;
outtable SAM_TEMP%rowtype ;
BEGIN
SP_OUT_RefCur_PARAM(REFCUR);
LOOP
FETCH REFCUR INTO outtable;
EXIT WHEN REFCUR%NOTFOUND;
dbms_output.put_line(outtable.col1);
END LOOP;
CLOSE REFCUR;
END;
--but when i try to run below script it is giving …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行我在Toad中使用的相同请求
(存储过程签名是两个varchar2参数和一个REF CURSOR参数)
这是我对Toad的处理方式
variable myCursor refcursor;
EXEC myproc('param1','param2',:myCursor );
print myCursor;
Run Code Online (Sandbox Code Playgroud)
我不知道如何用Squirrel写这个,我必须使用Squirrel.
非常感谢您的回复
拉斐尔
我是PL/SQL的新手,我在学习过程中只需要游标.我一直在看类型的存储过程参数OUT SYS_REFCURSOR,据我所知,其目的是"返回数据"就像C语言中的指针一样.我一直想知道SYS_REFCURSOR如果程序必须打开并且无法关闭它,谁将关闭此参数?(如果程序关闭,OUT SYS_REFCURSOR那么将不会返回任何数据).
另外,我认为,依赖于包含OUT SYS_REFCURSOR参数的存储过程以外的外部函数来关闭游标是不好的设计.有没有办法可以在不使用游标的情况下从存储过程返回表格?
我正在使用一个提供基于Oracle函数的数据库API的产品,我能够通过ODP.NET调用函数.但是,我无法弄清楚,如何调用包含Ref Cursor作为Out-parameter的函数.到目前为止我找到的所有样本都调用带有Out参数的过程或带有Ref Cursor的函数作为返回值.我试图类似地定义参数,但不断得到提供错误数量或类型参数的错误.
这是函数头(显然是混淆的):
FUNCTION GetXYZ(
uniqueId IN somepackage.Number_Type,
resultItems OUT somepackage.Ref_Type)
RETURN somepackage.Error_Type;
Run Code Online (Sandbox Code Playgroud)
这些是"somepackage"中的类型定义:
SUBTYPE Number_Type IS NUMBER(13);
TYPE Ref_Type IS REF CURSOR;
SUBTYPE Error_Type IS NUMBER;
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的代码:
string sql = "otherpackage.GetXYZ";
var getXYZCmd = OracleCommand oracleConnection.CreateCommand(sql);
getXYZCmd.CommandType = CommandType.StoredProcedure;
getXYZCmd.Parameters.Add("uniqueId", OracleDbType.Int32).Value = uniqueExplosionId;
getXYZCmd.Parameters.Add("resultItems", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
getXYZCmd.Parameters.Add("return_value", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue;
Run Code Online (Sandbox Code Playgroud)
我尝试了以下不同的方法来调用函数(当然一次只能调用一个函数):
var result = getXYZCmd.ExecuteNonQuery();
var reader = getXYZCmd.ExecuteReader();
var scalarResult = getXYZCmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
但是每个都失败并显示错误消息:
Oracle.DataAccess.Client.OracleException: ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments …Run Code Online (Sandbox Code Playgroud) 许多 RDBMS 支持某种“CURSOR”类型。这些类型在从存储过程返回时最有用。Oracle 中的一个例子:
TYPE t_cursor_type IS REF CURSOR;
CREATE PROCEDURE p (c OUT t_cursor_type);
Run Code Online (Sandbox Code Playgroud)
当使用 JDBC 调用此过程时,OracleTypes.CURSOR = -10应使用“JDBC”类型。该类型不属于任何标准,也不会成为 Java 7 中 JDBC 4.1 的一部分。
有谁知道 JSR 人员是否会考虑在将来某个时候将这种类型添加到标准中?或者其他 RDBMS 是否有类似的“供应商特定类型”?
我有OUT一个存储过程的参数作为REF CURSOR.基于特定条件,我想要返回一个结果集(已经实现).但是当条件失败时如何返回空光标?没有提出异常?只是粘贴伪代码:
IF condition = true THEN
OPEN OUT_CUR FOR
Select Some query
ELSE
Return empty OUT_CUR
END IF
Run Code Online (Sandbox Code Playgroud) 我收到错误 - PLS-00382 表达式类型错误。
我想将参考光标作为输出。请让我知道我该怎么做
create or replace function test_cur
return sys_refcursor
as
var_ref sys_refcursor;
begin
open var_ref for
select item,status
from item_master
where rownum <10;
return var_ref;
end;
declare
l_var sys_refcursor;
l_item varchar2(100);
l_status varchar2(10);
begin
l_var:=test_cur;
open l_var;
loop
fetch l_var into l_item,l_status;
exit when l_var%notfound;
dbms_output.put_line(l_item||','||l_status);
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
ref-cursor ×10
oracle ×9
plsql ×3
cursor ×2
function ×1
java ×1
jdbc ×1
odp.net ×1
oracle10g ×1
plpgsql ×1
postgresql ×1
rapidsql ×1
sql ×1
squirrel-sql ×1