创建Oracle PL / SQL存储过程

时间:2017-07-16 16:26:39

标签: oracle stored-procedures plsql oracle12c

我试图将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;

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

3 个答案:

答案 0 :(得分:4)

  

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

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

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

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

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

答案 1 :(得分:2)

用于编译代码的环境是什么?你当然应该看到一些即时反馈。

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

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

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

并且“/”将提交您的声明以供执行。

答案 2 :(得分: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;