【问题标题】:Creating Oracle PL/SQL Stored procedure创建 Oracle PL/SQL 存储过程
【发布时间】:2017-12-21 04:48:37
【问题描述】:

我正在尝试将 SQL 查询转换为 Oracle PL/SQL 存储过程。

这里是查询:

select * from table1 where DATE = " + s1 + " and TYPE='" + ty + "' and  NAME='"+nm+"' Order by TYPE DEsc;

这里是存储过程:

CREATE PROCEDURE procedure1
    ( 
    s1 IN DATE,
    ty IN CHAR DEFAULT 2,
    nm IN VARCHAR2 DEFAULT 64
    )
IS 
    d table1.DATE%TYPE;
    C table1.TYPE%TYPE;
    S table1.NAME%TYPE;
    CURSOR tb IS select DATE,TYPE,NAME INTO d,c,s from table1;
BEGIN
    FOR i IN tb
    LOOP 
        DBMS_OUTPUT.PUT_LINE('DATE' ||i.DATE);
        DBMS_OUTPUT.PUT_LINE('TYPE' ||i.TYPE);
        DBMS_OUTPUT.PUT_LINE('NAME' ||i.NAME);
    END LOOP;

END procedure1;

执行存储过程后我没有看到任何输出。我不确定我是否正确创建了存储过程。

【问题讨论】:

  • 如果您正在使用 sqldeveloper 并突出显示给定的文本并执行它,您应该得到 ORA-936。如果您使用的是 sqlplus,那么当您按下 [Enter] 时,不会执行任何操作,因为 sqlplus 在看到 create procedure 时会执行一些特殊操作。在看到/ 字符本身出现在一行之前,它不会执行任何操作。欢迎来到 SO。

标签: oracle stored-procedures plsql oracle12c


【解决方案1】:

“执行存储过程后看不到任何输出”

您的“输出”是 DBMS_OUTPUT,用于在屏幕上显示文本。但是,默认情况下它将文本写入缓冲区,我们需要启用输出以查看缓冲区的内容。

如何执行此操作取决于您使用的客户端。在 SQL*Plus 中是

SQL> set serveroutput on

在 TOAD、PLSQL Developer 或 Oracle SQL Developer 等 IDE 中,有一个单独的 DBMS_OUTPUT 选项卡:单击该选项卡并启用输出(有一个按钮) - 或将 Preferences 设置为始终打开。

DBMS_OUTPUT 很少是在实际应用程序中返回数据的有用方法。通常的方法是使用映射到 JDBC 和 ODBC ResultSet 类的 Ref Cursor。像这样的:

CREATE OR REPLACE PROCEDURE procedure1
    ( 
        s1 IN DATE,
        ty IN CHAR DEFAULT 2,
        nm IN VARCHAR2 DEFAULT 64,
        rc out sys_refcursor 
    )
IS 
BEGIN
    open rc for 
        select * from table1
        where d  = s1
        and c = ty
        and s = nm;
END procedure1;
/

顺便说一句,您的参数是使用字符串数据类型定义的,但默认值是数值。请不要养成坏习惯。强数据类型是防止数据损坏和代码损坏的关键防御措施,因此请始终使用正确的数据类型。

【讨论】:

    【解决方案2】:

    试试这个;

     CREATE PROCEDURE PROCEDURE1 (
                                  S1   IN DATE,
                                  TY   IN CHAR DEFAULT 2,
                                  NM   IN VARCHAR2 DEFAULT 64
                                 )
     IS
     BEGIN
    
        FOR I IN (SELECT DATE, TYPE, NAME FROM TABLE1)--Easier way to use cursor
        LOOP
           DBMS_OUTPUT.PUT_LINE ('DATE' || I.DATE);
           DBMS_OUTPUT.PUT_LINE ('TYPE' || I.TYPE);
           DBMS_OUTPUT.PUT_LINE ('NAME' || I.NAME);
        END LOOP;
     END PROCEDURE1;
    

    通过执行这个你只创建了过程并将它存储在db中,你需要调用它并打开系统输出才能看到输出。像这样:

    set serveroutput on;
    
    begin
        PROCEDURE1(null, null, null);
    end;
    

    【讨论】:

    • 您修改后的代码不会对程序的编译或执行产生实质性影响。
    【解决方案3】:

    使用什么环境来编译您的代码?您肯定会立即看到一些反馈。

    但请注意,在大多数环境中,您需要做的事情比以前多一些。

    最后的“;”在您的代码中是 PL/SQL 的一部分。它确实不会触发你的 DDL 的执行。通常你应该这样做:

    CREATE OR REPLACE PROCEDURE myproc
    IS
    BEGIN
      ...
    END myproc;
    /
    

    而那个“/”将提交你的语句以供执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2013-10-07
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多