34

在 Sql Server 中,我经常在测试存储过程的主体时,将主体复制到 SSMS 中,在页面顶部声明变量,将它们设置为一些示例值,然后按原样执行主体。

例如,如果我的 proc 是

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

然后我的测试 sql 将是

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

与此等效的 Oracle PL/SQL 是什么?

这是我想出的最接近的,但我得到“PLS-00428:此 SELECT 语句中应有一个 INTO 子句”

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     select myname from DUAL;
END;

这是我真正想做的一个更好的例子:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     SELECT *
     FROM   Customers
     WHERE  Name = myname;
END;

但同样,它需要一个“INTO”,而我真的只想将记录打印在屏幕上,而不是存储在另一个表中......

解决:

感谢@Allan,我已经让它运行得很好。Oracle SQL Developer 显然会记住您提供给它的参数值。然而,PL/SQL Developer 不想与此有任何关系......

在此处输入图像描述

如果您“以脚本方式运行”,它将遵循您的默认设置,但它只会以 ASCI 文本的形式返回结果,而不是在网格/电子表格中

在此处输入图像描述

4

3 回答 3

30

修订答案

如果您不是从另一个程序调用此代码,则可以选择跳过 PL/SQL 并使用绑定变量在 SQL 中严格执行:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

在许多工具(例如 Toad 和 SQL Developer)中,省略varandexec语句会导致程序提示您输入值。


原始答案

T-SQL 和 PL/SQL 之间的一个很大区别是 Oracle 不允许您隐式返回查询结果。结果总是必须以某种方式显式返回。最简单的方法是使用DBMS_OUTPUT(大致相当于print)输出变量:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

但是,如果您尝试返回结果集,这并不是很有帮助。在这种情况下,您可能想要返回一个集合或一个引用。但是,使用这些解决方案中的任何一个都需要将您的代码包装在一个函数或过程中,并从能够使用结果的东西中运行该函数/过程。以这种方式工作的函数可能如下所示:

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;
于 2012-06-04T19:53:10.733 回答
5

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

如果您有一个只返回一行的查询,那么您可以使用以下select...into...语法,例如:

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
于 2012-06-04T20:26:53.540 回答