我正在尝试构建一个查询,用作运行数据提取的模板并为我提供运行时信息。
"@"&RFLD.&RFLE..&REXT.";"
部分旨在调用任何简单的SQL查询。
到目前为止,它按预期工作,但我希望它添加
@"&RFLD.&RFLE..&REXT.";
中查询检索到的行数。例如,@"Path\AddressBook.sql"
将检索 20 行,@"Path\ItemMaster.sql"
将检索 150 行,@"Path\ItemBranch.sql"
将检索 1000 行,等等。
我遇到的问题是我不能将“@”放在
BEGIN - END
部分中,并且我没有成功检索同一部分之外的 SQL%ROWCOUNT
。
我将非常感谢任何想法。这是我的完整代码:
SET SERVEROUTPUT ON SIZE UNLIMITED;
SET ECHO OFF;
SET VERIFY OFF;
SET FEEDBACK OFF;
SET PAGES 0;
SET LINES 32767;
SET TRIMOUT ON;
SET TRIMSPOOL ON;
SET SQLFORMAT CSV;
--SET MARKUP CSV ON DELIMITER ',' QUOTE ON;
VARIABLE VDATESTR VARCHAR2(30);
SET TERMOUT ON;
DECLARE
VDATESTR VARCHAR(30);
VDATE VARCHAR(20);
BEGIN
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') INTO VDATE FROM DUAL;
:VDATESTR := VDATE;
DBMS_OUTPUT.PUT_LINE('Start Date-Time: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS TZH'));
END;
/
COLUMN RUN_FOLD NEW_VALUE RFLD HEADING Run_Folder;
COLUMN RUN_FILE NEW_VALUE RFLE HEADING Run_File;
COLUMN RUN_EXTN NEW_VALUE REXT HEADING Run_Ext;
BEGIN
DBMS_OUTPUT.PUT_LINE('.-.-.-.');
DBMS_OUTPUT.PUT_LINE('SQL Query File...');
END;
/
ACCEPT PRUN_FOLD CHAR PROMPT '..... Folder Name? ';
ACCEPT PRUN_FILE CHAR PROMPT '..... File Name (NO extension)? ';
SET TERMOUT OFF;
SELECT RUN_FOLD || DECODE(SUBSTR(RUN_FOLD, -1, 1), '\', NULL, '\') RUN_FOLD, SUBSTR(RUN_FILE, 1, NVL(NULLIF(INSTR(RUN_FILE, '.'), 0), LENGTH(RUN_FILE) + 1) - 1) RUN_FILE, 'SQL' RUN_EXTN
FROM (SELECT TRIM('&PRUN_FOLD.') RUN_FOLD, '&PRUN_FILE.' RUN_FILE FROM DUAL);
SET TERMOUT ON;
BEGIN
DBMS_OUTPUT.PUT_LINE('.-.-.-.');
DBMS_OUTPUT.PUT_LINE('Spool Output File...');
END;
/
COLUMN SPL_FOLD NEW_VALUE SFLD HEADING Spool_Folder;
COLUMN SPL_FILE NEW_VALUE SFLE HEADING Spool_File;
COLUMN SPL_EXTN NEW_VALUE SEXT HEADING Spool_Ext;
ACCEPT SSPL_FOLD CHAR PROMPT '..... Folder Name? ';
ACCEPT SSPL_FILE CHAR PROMPT '..... File Name (NO extension - CSV only)? ';
SET TERMOUT OFF;
SELECT SPL_FOLD || DECODE(SUBSTR(SPL_FOLD, -1, 1), '\', NULL, '\') SPL_FOLD,
SUBSTR(SPL_FILE, 1, NVL(NULLIF(INSTR(SPL_FILE, '.'), 0), LENGTH(SPL_FILE) + 1) - 1) || TO_CHAR(SYSTIMESTAMP, '_YYYYMMDD_HH24MITZH') SPL_FILE, 'CSV' SPL_EXTN
FROM (SELECT TRIM('&SSPL_FOLD.') SPL_FOLD, '&SSPL_FILE.' SPL_FILE FROM DUAL);
SPOOL "&SFLD.&SFLE..&SEXT.";
@"&RFLD.&RFLE..&REXT.";
SPOOL OFF;
SET TERMOUT ON;
DECLARE
VDATESSTR VARCHAR(30);
VDATES TIMESTAMP;
VDATEE TIMESTAMP;
VDATE_DIF INTERVAL DAY TO SECOND;
BEGIN
SELECT TO_TIMESTAMP(:VDATESTR, 'YYYY-MM-DD HH24:MI:SS'), SYSTIMESTAMP INTO VDATES, VDATEE FROM DUAL;
DBMS_OUTPUT.PUT_LINE('.-.-.-.');
DBMS_OUTPUT.PUT_LINE('File Name: &SFLE.');
DBMS_OUTPUT.PUT_LINE('End Date-Time: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS TZH'));
VDATE_DIF := VDATEE - VDATES;
DBMS_OUTPUT.PUT_LINE('Cycle Time: ' || VDATE_DIF);
END;
/
SET PAGES 70;
--SET MARKUP CSV OFF;
SQL*Plus 不是一个很棒的编程工具,因此选择使用它时您可能会发现有些事情很难实现。至于报告查询的行数:
1. 除非您关闭反馈,否则 SQL*Plus 会在查询输出结束时自动报告行数:
60 rows selected
这将位于您的假脱机文件中,如果您愿意,可以将其 grep 出来。
wc -l
来获取行数。不幸的是,您不能使用
SQL%ROWCOUNT
,因为这是 PL/SQL(一种real编程语言)功能,并且您没有在 PL/SQL 中执行查询。