*EDIT6:*这最终为我工作(从接受的答案):
var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc)
print :tran_cnt
print :msg_cnt
print :rc
Run Code Online (Sandbox Code Playgroud)
SQL Developer让这个超级难/不可能?我不在乎该实用程序是否基于命令行; 我只是希望能够快速运行并查看它.如果它也能很好地捕获错误,那就太好了.能够逐步(交互式)登录,以及一次性指定所有内容(类似于典型的基于ftp/sftp cmd的客户端的工作方式)将会很棒.
我的平台是Windows Server 2008 + Cygwin.
编辑:也许你会知道如何使用Python编写脚本?
编辑2:在MSFT SQL服务器中,我只需输入:
get_user 1;
Run Code Online (Sandbox Code Playgroud)
然后突出显示它并点击F5,我得到:
login name
NULL Somename
Run Code Online (Sandbox Code Playgroud)
打印到输出窗口.Oracle SQL开发人员根本没有帮助.我不知道如何传入1,我不知道如何查看返回的实际行/记录.
编辑3:当我输入var rc refcursor;
并选择并运行它时,我收到此错误(GUI):
An error was encountered performing the requested …
Run Code Online (Sandbox Code Playgroud) oracle plsql stored-procedures sys-refcursor oracle-sqldeveloper
我有一个返回sys-refcursor的Oracle函数,当我使用Hibernate 4调用这个函数时,我得到以下异常.
Hibernate: { ? = call my_function(?) }
org.hibernate.exception.GenericJDBCException: could not execute query
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288)
at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:313)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
Oracle功能
create or replace
FUNCTION my_function(p_val IN varchar2)
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR SELECT emp_name FROM employees
WHERE lower(emp_name) like lower(p_val||'%');
RETURN my_cursor;
END;
Run Code Online (Sandbox Code Playgroud)
我的实体课
@Entity
@javax.persistence.NamedNativeQuery(name = "getFunc", query =
"{ ? = call my_function(:empName) }",
resultClass = Employee.class, hints =
{ @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") …
Run Code Online (Sandbox Code Playgroud) 我正在尝试执行用户定义的Oracle函数,该函数使用ODP.NET返回RefCursor.这是功能:
CREATE OR REPLACE FUNCTION PKG.FUNC_TEST (ID IN TABLE.ID%type)
RETURN SYS_REFCURSOR
AS
REF_TEST SYS_REFCURSOR;
BEGIN
OPEN REF_TEST FOR
SELECT *
FROM TABLE;
RETURN REF_TEST;
END;
/
Run Code Online (Sandbox Code Playgroud)
我可以在Toad中调用此函数(从dual中选择func_test(7))并返回CURSOR.但是我需要使用C#和ODP.NET来获取光标以填充DataSet,但我不断得到NullReferenceException - "对象引用未设置为对象的实例".以下是我的意见:
OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
OracleCommand sqlCom = new OracleCommand("select func_test(7) from dual", oracleCon);
sqlCom.Parameters.Add("REF_TEST", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
OracleDataAdapter dataAdapter = new OracleDataAdapter();
dataAdapter.SelectCommand = sqlCom;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet); //FAILS HERE with NullReferenceException
Run Code Online (Sandbox Code Playgroud)
我能够在使用存储过程和ODP.NET时找到大量信息和示例,但对于从函数返回RefCursors并没有那么多.
编辑: 我不想显式地将输入参数添加到OracleCommand对象(即sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
),因为这使得很难将其作为通用RESTful Web服务实现,但我将其作为我的最后手段,但将使用存储过程.
任何帮助深表感谢!
我需要帮助.(我搜索了很多并且变得更加困惑.)
我使用Toad 9.7.25并且我做了这个程序(在一个包中)
PROCEDURE ReportaCC(pfcorte IN DATE, lcursor IN OUT SYS_REFCURSOR)
IS
BEGIN
OPEN lcursor FOR
select c1, c3, c3 from table1 where hdate = pfcorte;
close lcursor;
END;
Run Code Online (Sandbox Code Playgroud)
在toad的sql编辑器中,我想执行该过程并将光标结果显示在toad的datagrid中:
--- I WANT THIS CODE CAN EXECUTE IN TOAD'S SQL EDITOR.
DECLARE
PFCORTE DATE;
LCURSOR SYS_REFCURSOR;
BEGIN
PFCORTE := '31/08/2012';
-- LCURSOR := NULL; -- Modify the code to initialize this parameter
mypaq.REPORTACC( TO_DATE(PFCORTE,'DD/MM/YYYY') , LCURSOR );
:to_grid := LCURSOR;
COMMIT;
END;
Run Code Online (Sandbox Code Playgroud)
当我执行脚本(F9),并设置变量:to_grid类型的光标,我得到下一个错误:
"ORA-24338:语句句柄未执行"
可能是什么问题
提前致谢.
谢谢你的四个帖子......工作得很好!
但是现在有另一个问题......如果我替换这样的复杂查询(从表中选择c1,c2,c3 ......)
PROCEDURE …
Run Code Online (Sandbox Code Playgroud) 下面的Wrt代码我不能将fetch-into-variable的类型声明为基础表的%ROWTYPE,因为SYS_REFCURSOR位于连接两个表的select上,并且还选择了几个基于两个表的属性调用的函数; 即我不能声明为L_RECORD T%ROWTYPE
---
DECLARE
P_RS SYS_REFCURSOR;
L_RECORD P_RS%ROWTYPE;
BEGIN
CAPITALEXTRACT(
P_RS => P_RS
);
OPEN P_RS;
LOOP
BEGIN
FETCH P_RS INTO L_RECORD;
EXIT WHEN P_RS%NOTFOUND;
...
EXCEPTION
WHEN OTHERS THEN
...
END;
END LOOP;
CLOSE P_RS;
END;
--------
CREATE or REPLACE PROCEDURE CAPITALEXTRACT
(
p_rs OUT SYS_REFCURSOR
) AS
BEGIN
OPEN p_rs for
select t.*,tminusone.*, f(t.cash), g(t.cash) FROM T t, TMINUSONE tminusone
where t.ticket=tminusone.ticket;
END CAPITALEXTRACT;
Run Code Online (Sandbox Code Playgroud)
当然,我不想在SYS_REFCURSOR中返回带有列的静态表R,然后声明为L_RECORD R%ROWTYPE.
因此问题是:如何声明一个弱类型SYS_REFCURSOR变量的%ROWTYPE?
我有一个存储过程,它使用该EXECUTE IMMEDIATE
命令执行一个非常长的字符串.如何支持非常长的字符串并将数据返回到refcursor中?
我需要创建一个交互式报告,但我不需要运行一个sql语句,而是需要运行一个pl/sql语句
-----------------------------------------------------------------------------
USER_ID Name 1 java 2 php 3 pl/sql / sql 4 Oracle apex
-------------- -------------------- ------ ----- -------------- -------------
3 Amy brown N N Y N
4 Sarah woods N N Y Y
2 Johnny paterson Y Y Y Y
1 John brown Y N Y Y
Run Code Online (Sandbox Code Playgroud)
如果在顶点中无法做到这一点,那么在运行pl/sql时,有没有办法以csv格式保存pl/sql语句的结果?
在交互式报告中,用户将无法添加或删除任何内容.它仅供观看.
谢谢
我正在使用一个提供基于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) 我正在尝试使用 spring 数据 jpa 和 spring 引导读取 oracle 存储过程中的 refcursor,该存储过程成功运行,但对返回的 List 的引用始终为空。
我尝试使用 Hibernate 作为 JPA 提供程序和 Eclipse Link 没有成功,下面是 oracle ddl 和 java 代码
Oracle 表(我用一些示例数据填充了该表)
CREATE TABLE role
(id NUMBER(10,0),
name VARCHAR2(255 CHAR))
Run Code Online (Sandbox Code Playgroud)
Oracle 存储过程
PROCEDURE collect_roles (role_list_o OUT SYS_REFCURSOR) IS
ex EXCEPTION;
BEGIN
OPEN role_list_o FOR SELECT id, name FROM role;
END;
Run Code Online (Sandbox Code Playgroud)
pom.xml(oracle jdbc 驱动依赖是从本地 ojdbc7.jar 安装在 maven 中的)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gridapp</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<properties> …
Run Code Online (Sandbox Code Playgroud) 我是 Oracle 新手,正在学习游标。我的表 City 有两列 city_id,city_name。所以,这就是我尝试过的:
DECLARE
CURSOR city_list is
SELECT * from OT.City;
v_list SYS_REFCURSOR;
BEGIN
OPEN city_list FOR
v_list := city_list;
DBMS_OUTPUT.PUT_LINE(v_list.city_id);
EXIT WHEN city_list%NOTFOUND;
CLOSE city_list;
END;
/
Run Code Online (Sandbox Code Playgroud)
我试图将游标的数据分配给新声明的值 v_list SYS_REFCURSOR;
。但是输出出现错误v_list := city_list;
。如何将游标的所有值直接分配给另一个游标,或者还有其他方法吗?
sys-refcursor ×10
oracle ×7
plsql ×5
function ×2
jpa ×2
odp.net ×2
oracle11g ×2
sql ×2
dynamic-sql ×1
hibernate ×1
java ×1
oracle-apex ×1
oracle10g ×1
ref-cursor ×1
rowtype ×1
spring-boot ×1
toad ×1