Oracle PL/SQL分析查询输出,写入文件
我正在做老板给我的一个项目。我没有多少经验,但我必须学习。这是关于oracledb11g的,我使用SQLPlus和PL/SQL作为查询语言 基本上,对于每个查询语句,我都需要脚本来解释结果并将true/false输出到文件中 比如说,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
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谓词。