2011-05-25 65 views
0

我正在开发一个项目,我的老板给了我。我没有太多经验,但我必须学习它。这是关于Oracle DB 11g的,我使用SQLPlus和PL/SQL作为查询语言。Oracle PL/SQL分析查询输出,写入文件

基本上对于每个查询语句,我将需要脚本来解释结果并输出true/false到文件。

例如,

select id from sample_table where id=3; 

/**code needed that will do something like:**/ 
/**if(id=3), write to file TRUE, else, write to file FALSE**/ 

select salary from sample2 where id=5; 

/**similar code needed as above**/ 

select employee from sample3 where id=6; 

/** another TRUE or FALSE output to the file **/ 

我一直在使用DBMS_OUTPUT.PUT_LINE尝试,但对如何直接从报表的查询分析输出不知道。将非常感谢任何帮助!

回答

1

如果从不同的表我将使用下面的选择 - 如果相同的查询正在与仅一个参数(如ID),用于可替换地,可以使用一个光标改变在这种情况下可以使用光标参数。

DECLARE 
    v_count PLS_INTEGER; 
BEGIN 
    SELECT COUNT(*) 
    INTO v_count 
    FROM sample_table 
    WHERE id=3; 

    CASE v_count 
     WHEN 0 THEN dbms_output.put_line('FALSE'); 
     ELSE dbms_output.put_line('TRUE'); 
    END CASE; 

END; 

它使用COUNT(*)作为COUNT(*)仍然返回0,如果不存在任何记录中的字段不算是很重要的。

编辑补充:光标相当于是

DECLARE 
    v_count PLS_INTEGER; 

    CURSOR count_cur(cp_id sample_table.id%TYPE) 
    IS 
     SELECT COUNT(*) 
     FROM sample_table 
     WHERE id = cp_id; 
BEGIN 
    OPEN count_cur(3); 
    FETCH count_cur INTO v_count; 
    CLOSE count_cur; 

    CASE v_count 
     WHEN 0 THEN dbms_output.put_line('FALSE'); 
     ELSE dbms_output.put_line('TRUE'); 
    END CASE; 

END; 

也有可用的测试上的光标,如光标%FOUND或光标%NOTFOUND可以访问一次打开游标。虽然如果你只是在测试一个记录是否存在,可能会更冗长。

还要记住,如果你正在做一个SELECT INTO语句,除非你正在做COUNT(*),它总是会返回一条记录,这是很好的形式来捕捉可能太多或者没有行的异常。

+1

行使用COUNT(*),以检查是否存在可以是一个更简单的方法当涉及的表包含大量行时,开销很大...... – 2011-05-25 11:50:23

+0

鉴于他所有的示例都使用ID进行测试,我做出了合理的假设,即将有索引 - 使其成为纯索引查找(索引唯一扫描)。额外的SORT AGGREGATE出现在我的解释计划中,而不是大量的开销 – Chris 2011-05-26 09:05:04

+0

我没有看到任何信息表明ID列是唯一的。如果它是唯一的,COUNT(*)仅仅是多余的,但对性能确实无害。如果没有,那么我的第一个评论仍然存在。我会添加一个FIRST_ROWS(1)提示和一个ROWNUM = 1谓词。 – 2011-05-26 10:23:21

1

基本上每个查询语句,我 需要的脚本解释 结果和输出真/假的 文件

通过“真正的假”我想你的意思是:“真“如果返回1行或更多行,如果没有行返回,则返回”false“。

你并不需要这样的PL/SQL包装,你可以把你所有的SQL语句到sqlplus中有一些设置和阀芯到一个文件中,是这样的:

spool "my_tests.dat" 
set serveroutput off 
set echo off 
set head off 
set pagesize 60 
set linesize 80 
set feedback 1 

prompt This should return no rows 
select dummy from dual where 1=0; 

prompt This should return 1 row 
select sysdate from dual; 

prompt This should return 2 rows 
select sysdate from dual 
union 
select sysdate-1 from dual; 

prompt Complete 
spool off 

保存脚本到文件(“my_script.sql”),使用与脚本文件相同的目录中的sqlplus登录到Oracle,然后键入:@ my_script.sql

退出sqlplus并且您的输出文件将与脚本文件位于同一目录中。

每个语句后,你会看到“选择无行”或“1列选择”或“选择2行”等

您还可以添加定时(上定时设定)和其他格式(标题等)。我把它留给你,检查herehere某些选项。

这可能是这样,而不是包装所有SQL PL/SQL中,只是为了得到一些基本的信息,如选择