创建 Oracle PL/SQL 存储过程

Creating Oracle PL/SQL Stored procedure

我正在尝试将 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;

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

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

请注意,虽然在大多数环境中,您需要做的比以前多一点。

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

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

然后“/”将提交您的声明以供执行。

"I do not see any output after Executing Stored procedure"

您的 "output" 是 DBMS_OUTPUT,用于在屏幕上显示文本。但是,默认情况下它会将文本写入缓冲区,我们需要启用输出才能看到缓冲区的内容。

如何执行此操作因您使用的客户端而异。在 SQL*加上它是

SQL> set serveroutput on

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

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

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;
/

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

试试这个;

 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;