2012-07-23 189 views
4
Set ServerOutput on size 100000; 
declare 
countTab number := 0; 
countCol number := 0; 
currDate varchar2(30); 
scale number := 0; 


Begin 

select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_INTERFACE' and COLUMN_NAME = 'TARGET_AMNT_LTV_NUM' and DATA_SCALE is null; 
IF (countCol <> 0) then 

DBMS_OUTPUT.put_line(' EVAPP_INTERFACE.TARGET_AMNT_LTV_NUM values begin'); 
execute immediate 'select APPSEQNO, TARGET_AMNT_LTV_NUM from evapp_interface where TARGET_AMNT_LTV_NUM > 999999999999'; 

END IF; 
END; 
\ 

我试图显示select查询的结果。我试图按照原样运行select语句,但它提供了一个例外,说它找不到提到的列。所以,我试着把列名称放在列的前面,它抱怨我需要使用INTO,我也使用它,但它仍然不喜欢语法。select语句的pl/sql显示结果

+0

和DATA_SCALE为空?这不是表格的一列USER_TAB_COLUMNS – Nathan 2012-07-23 15:34:04

+1

@Nathan - [yes yes is](http://docs.oracle.com/cd/E14072_01/server.112/e10820/statviews_5459.htm); '数字中小数点右侧的数字'。 – 2012-07-23 15:49:17

回答

3

假设你正在使用SQL * Plus,最简单的方法可能是如果你想显示从PL/SQL结果做类似的东西

Set ServerOutput on size 100000; 
variable rc refcursor; 
declare 
    countTab number := 0; 
    countCol number := 0; 
    currDate varchar2(30); 
    scale number := 0; 
Begin 
    select count(*) 
    into countCol 
    from USER_TAB_COLUMNS 
    where TABLE_NAME = 'EVAPP_INTERFACE' 
    and COLUMN_NAME = 'TARGET_AMNT_LTV_NUM' 
    and DATA_SCALE is null; 
    IF (countCol <> 0) then 
    DBMS_OUTPUT.put_line(' EVAPP_INTERFACE.TARGET_AMNT_LTV_NUM values begin'); 
    open :rc 
    FOR 'select APPSEQNO, TARGET_AMNT_LTV_NUM ' || 
     ' from evapp_interface ' || 
     ' where TARGET_AMNT_LTV_NUM > 999999999999'; 
    END IF; 
END; 
/

PRINT rc; 

,你需要打开游标,取结果导入局部变量,然后用局部变量做一些事情,比如将它们写入DBMS_OUTPUT

+0

如果我有其他的SQL块,我正在检查其他列,我使用不同的光标?或者我可以使用同一个,并最终打印所有内容? – roymustang86 2012-07-23 16:14:31

+0

@ roymustang86 - 我不确定我是否理解这个问题。游标是指向查询的指针。如果您声明需要执行多个动态查询,并且希望在执行了许多匿名PL/SQL块后打印每个查询的结果,则需要在SQL * Plus中声明多个'refcursor'变量。如果你只是要执行一个匿名块,打印结果,执行另一个匿名块,打印结果等,那么你可以在SQL * Plus中使用一个'refcursor'变量。 – 2012-07-23 16:17:29

+0

我做了你所说的,但在8个光标后,它给了我错误,说光标已关闭。另外,Oracle是否注意在脚本结尾关闭游标? – roymustang86 2012-07-23 17:01:30