标签: sys-refcursor

如何使用Oracle SQL开发人员运行存储过程?

*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

19
推荐指数
1
解决办法
16万
查看次数

如何使用Hibernate(EntityManager)或JPA 2调用Oracle函数或过程

我有一个返回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)

java oracle hibernate jpa sys-refcursor

12
推荐指数
2
解决办法
6万
查看次数

如何从Oracle函数返回RefCursor?

我正在尝试执行用户定义的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服务实现,但我将其作为我的最后手段,但将使用存储过程.

任何帮助深表感谢!

oracle function odp.net sys-refcursor

9
推荐指数
1
解决办法
3万
查看次数

如何在TOAD的DataGrid中显示sys_refcursor数据

我需要帮助.(我搜索了很多并且变得更加困惑.)

我使用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)

sql toad plsql sys-refcursor oracle11g

9
推荐指数
1
解决办法
3万
查看次数

如何声明一个弱类型SYS_REFCURSOR变量的%ROWTYPE?

下面的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?

oracle plsql stored-procedures sys-refcursor rowtype

8
推荐指数
1
解决办法
2万
查看次数

Oracle EXECUTE IMMEDIATE到游标中

我有一个存储过程,它使用该EXECUTE IMMEDIATE命令执行一个非常长的字符串.如何支持非常长的字符串并将数据返回到refcursor中?

sql oracle stored-procedures dynamic-sql sys-refcursor

7
推荐指数
1
解决办法
4万
查看次数

如何使用pl/sql 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语句的结果?

在交互式报告中,用户将无法添加或删除任何内容.它仅供观看.

谢谢

plsql sys-refcursor oracle10g oracle-apex

7
推荐指数
1
解决办法
1780
查看次数

如何使用Ref Cursor作为C#的Out-parameter调用Oracle函数?

我正在使用一个提供基于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)

oracle function odp.net sys-refcursor ref-cursor

6
推荐指数
1
解决办法
3万
查看次数

使用 spring 数据 jpa 在存储过程中读取引用游标作为输出参数返回 null

我正在尝试使用 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)

jpa sys-refcursor spring-data-jpa spring-boot

6
推荐指数
1
解决办法
4310
查看次数

oracle中如何打印光标值?

我是 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;。如何将游标的所有值直接分配给另一个游标,或者还有其他方法吗?

oracle plsql stored-procedures sys-refcursor oracle11g

6
推荐指数
2
解决办法
2万
查看次数