Oracle PL / SQL分析查询输出,写入文件

时间:2011-05-25 09:53:01

标签: oracle plsql oracle11g sqlplus writetofile

我正在做一个老板给我的项目。我没有太多经验,但我必须学习它。它与Oracle DB 11g有关,我使用SQLPlus和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,但不知道如何直接分析查询语句的输出。非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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 :(得分:1)

  

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

“true false”我假设你的意思是:如果返回1行或更多行,则为“True”,如果没有返回行,则为“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中,只是为了获取一些基本信息,例如选择的行