2

很多年前我曾经做过Oracle开发。在过去 15 年的大部分时间里,我主要从事 SQL Server 工作,在我从事 Oracle 工作的地方,与 Web 服务等工作隔离开来。

我的问题似乎已经在网上被问过几次,但似乎很难以某种方式交流——至少从答案来看。我非常感谢工具和功能的不同,我知道我必须学习新事物,但这很简单,但似乎很难做到。

我正在寻找对数据库进行一些临时查询。目前我们正在使用 SQL Navigator - 我愿意使用其他工具......

在 SQL Server Management Studio 中,如果您打开查询窗口,键入一些返回值或集合的 SQL,您会在结果窗口中很好地显示行或值。

我已经收集到 Oracle PL/SQL 的情况有点不同,我发现我需要返回一个游标 - 但是我如何获得一个工具来显示结果?

我开始很简单:

    declare 
        my_id number := 356655;
        cursor c1  is select my_id from dual;

    begin
        open c1;   
    end;

这运行良好 - 但我如何查看结果?是否有任何工具可以像 SSMS 一样“很好地”处理这个问题?我习惯于能够做很多这样的事情,包括像

(也许不完全正确的语法?但你明白了......)

declare 
    my_id number := 356655;
    cursor c1  is select name from my_table where id = my_id;

begin
    open c1;   

并将结果作为文本/网格显示给我。理想情况下,有一个很好的解决方案。也许是一些漂亮的新工具?

4

3 回答 3

3

使用SQL Developer或 SQL*Plus,您可以使用在 PL/SQL 块之前声明的绑定变量:

variable rc refcursor;
declare 
  my_id number := 356655;
begin
  open :rc for select my_id from dual;
end;
/

print rc

RC
-------------------------------
356655                                  

您还可以在查询中使用绑定变量,这很有用:

variable my_id number;
variable rc refcursor;
execute :my_id := 356655;

begin
  open :rc for select :my_id from dual;
end;
/

print rc

variable和命令包含在 SQL*Plus 文档中,该print文档在很大程度上也适用于 SQL Developer - 它有自己的文档,包括从 SQL*Plus 继承的命令

如果你有一个返回引用游标的函数,那么你可以在查询中调用它, as select func(val) from dual,然后结果可以进入网格;或者您可以使用相同的绑定变量调用函数(或过程):rc并打印它。但是,如果您只进行临时查询,我不确定两者是否有用。

另一方面,使用 PL/SQL 块进行临时查询似乎有点笨拙,即使您的查询很复杂。您需要一个充分的理由从块中为 select 语句打开游标,而不是直接运行select。(不确定这是否是 SQL Server 的事情,或者您是否真的需要这样做!)。如果您只是在块内运行查询,则不需要该块,即使您想为查询中使用的值保留绑定变量:

variable my_id number;
execute :my_id := 356655;
select :my_id from dual;

    :MY_ID
----------
    356655 
于 2014-03-31T10:15:49.430 回答
1

我使用Oracle SQL Developer

无论如何,这应该适用于任何 oracle sql 客户端:

如果您只想查看结果,可以使用

dbms_output.put_line('Foo' || somevar || ' bar');

在此之前,运行

 SET SERVEROUTPUT ON 

检查docs.oracle.com上的示例

于 2014-03-31T10:10:16.397 回答
1

我建议使用 oracle 网站上免费提供的 sql developer。有一个按钮可让您将 sql 作为脚本运行,该脚本将返回您想要的内容。SSMS 不适用于 pl/sql。

于 2014-03-31T10:10:49.613 回答