【问题标题】:How do I execute a procedure from SQL Developer?如何从 SQL Developer 执行过程?
【发布时间】:2020-05-22 16:43:45
【问题描述】:

我有一个如下所示的存储过程以及如何从 SQL Developer 执行?

PROCEDURE CFR.GET_ALL_ERROR_HISTORY
Argument Name  Type       In/Out Default? 
-------------- ---------- ------ -------- 
T1_CURSOR      REF CURSOR OUT             
P_QUERY_TYPE   NUMBER     IN              
P_DATE_START   DATE       IN     DEFAULT  
P_DATE_END     DATE       IN     DEFAULT  
P_COMP_NUMBER   NUMBER     IN     DEFAULT  
P_COMP_GROUP_ID NUMBER     IN     DEFAULT  

在 Visual Studio 中运行我的代码时

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_ALL_ERROR_HISTORY'
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_ALL_ERROR_HISTORY'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我的 VS 代码

    Dim oracleParameter(3) As OracleParameter
    oracleParameter(0) = New OracleParameter()
    oracleParameter(1) = New OracleParameter()
    oracleParameter(2) = New OracleParameter()
    oracleParameter(3) = New OracleParameter()

    oracleParameter(0) = cmd.Parameters.Add("T1_Cursor", dbType:=Oracle.ManagedDataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output)
    oracleParameter(1) = cmd.Parameters.Add("p_Date_Start", dbType:=Oracle.ManagedDataAccess.Client.OracleDbType.Date, val:=dteStart, ParameterDirection.Input)
    oracleParameter(2) = cmd.Parameters.Add("p_Date_End", dbType:=Oracle.ManagedDataAccess.Client.OracleDbType.Date, val:=dteEnd, ParameterDirection.Input)
    oracleParameter(3) = cmd.Parameters.Add("p_Query_Type", dbType:=Oracle.ManagedDataAccess.Client.OracleDbType.Decimal, val:=intQueryType, ParameterDirection.Input)

我是程序新手,如果您能指导我如何解决这个问题。剩下的我自己都可以解决

【问题讨论】:

    标签: oracle stored-procedures oracle-sqldeveloper


    【解决方案1】:

    有代码方式。

    在 SQL 工作表中:

    begin
     CFR.GET_ALL_ERROR_HISTORY(1, sysdate, sysdate+1, 1, 2);
    end;
    /
    

    Note you'll need to declare a local sys refcursor variable and supply that in the call if you want to catch the value, then you'll use the PRINT command to print the output.

    这不是最佳实践,使用参数的顺序来指示为哪个输入分配什么值...最好在调用中使用命名符号,类似于

    DECLARE
      P_EMP_ID NUMBER;
      P_START_DATE DATE;
      P_END_DATE DATE;
      P_JOB_ID VARCHAR2(10);
      P_DEPARTMENT_ID NUMBER;
    BEGIN
      P_EMP_ID := 1;
      P_START_DATE := sysdate-365;
      P_END_DATE := sysdate;
      P_JOB_ID := 'SALES';
      P_DEPARTMENT_ID := 101;
    
      ADD_JOB_HISTORY(
        P_EMP_ID => P_EMP_ID,
        P_START_DATE => P_START_DATE,
        P_END_DATE => P_END_DATE,
        P_JOB_ID => P_JOB_ID,
        P_DEPARTMENT_ID => P_DEPARTMENT_ID
      );
    END;
    /
    

    EXEC CFR.GET_ALL_ERROR_HISTORY(1,...)
    

    还有 GUI 方式。

    从树中打开过程,然后点击执行按钮。好消息是,我们会为您获取 OUT refcursor 并向您展示结果。

    【讨论】:

    • 绿色播放按钮是“执行”按钮 - 它会创建您的匿名 plsql 块来为您执行存储过程
    • 谢谢。当我输入 desc procedureName 时,我有 6 个参数,但我只发送了 4 个。我们在这里做什么?
    • 您的描述清楚地表明有 6 个参数。 4 似乎具有默认值,因此您可以根据需要省略它们。
    • 谢谢。我明白你的意思了。在调用我的过程时,我如何知道括号中的每个值在过程中映射到什么?是 var rc refcursor exec :rc := CFR.GET_ALL_ERROR_HISTORY(1, "02/01/2010", "02/01/2020", 1);正确
    • 最佳实践是使用命名(与位置)表示法...我很着急,所以我使用了位置
    猜你喜欢
    • 2011-05-07
    • 2011-07-09
    • 2011-11-11
    • 2023-03-04
    • 2020-04-13
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多