PL / SQL块 - 简单地看输出? [一个非常简单的问题我确定!]

时间:2011-08-30 03:09:21

标签: plsql oracle10g sqlplus

我确定我想要的很简单,但我无法弄明白。

我想:

  • 声明一些变量并将其初始化为特定值
  • 执行多项选择(由上述变量值预测)并查看结果,就好像我已直接在sqlplus命令行上执行结果一样

我认为有必要使用块结构,以便我可以在查询的谓词中声明和使用变量。虽然这里显示的例子在实际情况下非常简单,但是有许多复杂的SELECT。

我试过这样做(暂时忘记谓词)......

DECLARE
    EMP_EMPLOYEE_ID_IN  VARCHAR2(12);
BEGIN
    EXECUTE IMMEDIATE 'SELECT * FROM DEPT WHERE DEPNO';
END;
/

...但是当我这样做时,我会在不看输出的情况下执行选择。

我也试过这个......

DECLARE
    EMP_EMPLOYEE_ID_IN  VARCHAR2(12);
BEGIN
    SELECT * FROM DEPT;
END;
/

......但接着我......

PLS-00428:此SELECT语句中需要一个INTO子句

...我真的不想为输出中出现的每一列声明一个变量。

任何人都可以告诉我如何执行SELECT但只是轻松地看到输出就像我在sqlplus命令行上一样,即看到相同的输出就好像我这样做

SQL> SELECT * FROM DEPT;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

由于



我现在测试了Shannon Severance给出的答案,发现它会做我想要的。

为了后来的读者,我认为在这里展示完整的脚本可能会有用。

set line 32000;
set trimspool on;
var V_CURSOR1 REFCURSOR;
var V_CURSOR2 REFCURSOR;
var V_CURSOR3 REFCURSOR;
DECLARE
    DEPT_NUM_IN     VARCHAR2(12);
BEGIN
    DEPT_NUM_IN :=  '10';
    OPEN :V_CURSOR1 FOR SELECT * FROM DEPT;
    OPEN :V_CURSOR2 FOR SELECT * FROM DEPT ORDER BY LOC;
    OPEN :V_CURSOR3 FOR SELECT * FROM DEPT WHERE DEPTNO = DEPT_NUM_IN ORDER BY LOC;
END;
/
print V_CURSOR1
print V_CURSOR2
print V_CURSOR3

2 个答案:

答案 0 :(得分:3)

从sqlplus开始,其他工具可能会有所不同。

首先声明一个sqlplus refcursor变量

SQL> var l_cursor refcursor

然后在PL / SQL块中打开该光标,您可以在其中访问声明的变量和所有内容:

SQL> edit
Wrote file afiedt.buf

  1  declare
  2      l_number number;
  3  begin
  4      open :l_cursor for select table_name from all_tables where rownum < 10;
  5* end;
SQL> /

PL/SQL procedure successfully completed.

请注意,refcursor变量前面加上:,这是因为我们将sqlplus变量绑定到PL / SQL匿名块

接下来,使用SQLPLUS打印命令:

SQL> print l_cursor

TABLE_NAME
------------------------------
ICOL$
CON$
UNDO$
PROXY_ROLE_DATA$
FILE$
UET$
IND$
SEG$
COL$

9 rows selected.

答案 1 :(得分:0)

DECLARE
  v_result VARCHAR2(400);

BEGIN

  SELECT dummy
    INTO v_result
    FROM dual;

  dbms_output.put_line(v_result);

END;