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