Oracle 从外部脚本“@”检索 SQL%ROWCOUNT?

问题描述 投票:0回答:1

我正在尝试构建一个查询,用作运行数据提取的模板并为我提供运行时信息。

"@"&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;
oracle plsql
1个回答
0
投票

SQL*Plus 不是一个很棒的编程工具,因此选择使用它时您可能会发现有些事情很难实现。至于报告查询的行数:

 1. 除非您关闭反馈,否则 SQL*Plus 会在查询输出结束时自动报告行数:

   60 rows selected

这将位于您的假脱机文件中,如果您愿意,可以将其 grep 出来。

  1. 清理假脱机文件后,您还可以在 shell 中使用
    wc -l
    来获取行数。

不幸的是,您不能使用

SQL%ROWCOUNT
,因为这是 PL/SQL(一种real编程语言)功能,并且您没有在 PL/SQL 中执行查询。

© www.soinside.com 2019 - 2024. All rights reserved.