Tom*_*day 24 t-sql sql-server oracle plsql oracle-sqldeveloper
在Sql Server中,经常在我测试存储过程的主体时,我将主体复制到SSMS中,将页面顶部的变量DECLARE,将它们设置为一些样本值,并按原样执行主体.
例如,如果我的proc是
CREATE PROC MySampleProc
@Name VARCHAR(20)
AS
SELECT @Name
Run Code Online (Sandbox Code Playgroud)
然后我的测试SQL将是
DECLARE @Name VARCHAR(20)
SET @Name = 'Tom'
SELECT @Name
Run Code Online (Sandbox Code Playgroud)
什么是Oracle PL/SQL相当于此?
这是我提出的最接近的,但是我得到了"PLS-00428:在这个SELECT语句中需要一个INTO子句"
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
select myname from DUAL;
END;
Run Code Online (Sandbox Code Playgroud)
这是我真正想要做的更好的例子:
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
SELECT *
FROM Customers
WHERE Name = myname;
END;
Run Code Online (Sandbox Code Playgroud)
但是,当我真的只想要在屏幕上打印的记录而不是存储在另一个表格中时,它想要一个'INTO'.
解决:
感谢@Allan,我的工作得很好.Oracle SQL Developer显然会记住您提供的参数值.然而,PL/SQL Developer不想与此有任何关系....
如果您"运行为脚本",它将遵循您的默认值,但它只会返回结果作为ASCI文本,而不是网格/电子表格
All*_*lan 20
修订后的答案
如果你没有从另一个程序调用这个代码,一个选项是跳过PL/SQL并使用绑定变量在SQL中严格执行:
var myname varchar2(20);
exec :myname := 'Tom';
SELECT *
FROM Customers
WHERE Name = :myname;
Run Code Online (Sandbox Code Playgroud)
在许多工具(例如Toad和SQL Developer)中,省略var
和exec
语句将导致程序提示您输入值.
原始答案
T-SQL和PL/SQL之间的一个很大区别是Oracle不允许您隐式返回查询结果.结果总是必须以某种方式显式返回.最简单的方法是使用DBMS_OUTPUT
(大致相当于print
)输出变量:
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
dbms_output.print_line(myname);
END;
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试返回结果集,这并不是非常有用.在这种情况下,您要么返回一个集合,要么返回一个refcursor.但是,使用这些解决方案中的任何一个都需要将代码包装在函数或过程中,并从能够消耗结果的内容中运行函数/过程.以这种方式工作的函数可能如下所示:
CREATE FUNCTION my_function (myname in varchar2)
my_refcursor out sys_refcursor
BEGIN
open my_refcursor for
SELECT *
FROM Customers
WHERE Name = myname;
return my_refcursor;
END my_function;
Run Code Online (Sandbox Code Playgroud)
在 Oracle PL/SQL 中,如果您正在运行可能返回多行的查询,则需要一个游标来迭代结果。最简单的方法是使用 for 循环,例如:
declare
myname varchar2(20) := 'tom';
begin
for result_cursor in (select * from mytable where first_name = myname) loop
dbms_output.put_line(result_cursor.first_name);
dbms_output.put_line(result_cursor.other_field);
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
如果您的查询只返回一行,则可以使用以下select...into...
语法,例如:
declare
myname varchar2(20);
begin
select first_name into myname
from mytable
where person_id = 123;
end;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
157105 次 |
最近记录: |