创建Oracle PL / SQL存储过程

Kir*_*el 2 oracle plsql stored-procedures oracle12c

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

这是查询:

select * from table1 where DATE = " + s1 + " and TYPE='" + ty + "' and  NAME='"+nm+"' Order by TYPE DEsc;
Run Code Online (Sandbox Code Playgroud)

这是存储过程:

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;
Run Code Online (Sandbox Code Playgroud)

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

APC*_*APC 5

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

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

具体操作方式取决于您所使用的客户端。在SQL * Plus中

SQL> set serveroutput on
Run Code Online (Sandbox Code Playgroud)

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

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;
/
Run Code Online (Sandbox Code Playgroud)

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