Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL分析查询输出,写入文件_Oracle_Plsql_Oracle11g_Sqlplus_Writetofile - Fatal编程技术网

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

Oracle PL/SQL分析查询输出,写入文件,oracle,plsql,oracle11g,sqlplus,writetofile,Oracle,Plsql,Oracle11g,Sqlplus,Writetofile,我正在做老板给我的一个项目。我没有多少经验,但我必须学习。这是关于oracledb11g的,我使用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

我正在做老板给我的一个项目。我没有多少经验,但我必须学习。这是关于oracledb11g的,我使用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_行,但不知道如何直接分析查询语句的输出。非常感谢您的帮助

如果您从不同的表中进行选择,我将使用以下命令-或者,如果同一查询仅使用一个参数(如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(*)not 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(*),它保证总是返回一条记录,否则捕获可能太多或没有行的异常是一种很好的形式

基本上,对于每个查询语句 将需要脚本来解释 结果并将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行”等

您还可以添加计时(设置计时打开)和其他格式(标题等)。我把这个留给你,看看有没有选择


这可能是一种更直接的方法,而不是将所有SQL封装在PL/SQL中,只是为了获得一些基本信息,例如使用COUNT(*)选择的行当涉及的表包含很多行时,检查是否存在可能会带来很大的开销……考虑到他所有的示例都使用ID进行测试,我做出了合理的假设,即会有索引-使其成为纯粹的索引查找(索引唯一扫描)。在我的解释计划中,在获取特定字段时显示的额外排序聚合几乎不存在,我看不到任何说明ID列是唯一的信息。如果它是唯一的,那么计数(*)只是多余的,但实际上对性能并没有危害。如果不是,那么我的第一句话仍然有效。我将添加一个FIRST_ROWS(1)提示和一个ROWNUM=1谓词。