web-dev-qa-db-ja.com

SQLPLUS:変数値を要求するSELECT INTO

なぜこれが私に価値を促しているのでしょうか?バッチファイルを介してスクリプトを呼び出しています。

DECLARE
   precount   NUMBER;
   nowcount   NUMBER;
BEGIN
    SELECT COUNT(*) INTO precount FROM PLAN_OFFER_BK_PRE_SCRIPT WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';
    SELECT COUNT(*) INTO nowcount FROM PLAN_OFFER WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';
END;
/

-- NUMBER OF MEC/MVP RECORDS
SPOOL logs\MVP_MEC_UPDATED.log APPEND
Prompt &&CLIENTID   &&precount  &&nowcount
SPOOL OFF;

ありがとう!

3
flashsplat

アンパサンド文字(&)は、デフォルトで実行時間前に値を要求します。これは、変数の値を表示する方法ではありません。代わりに以下をお試しください。

set serveroutput on

SPOOL logs\MVP_MEC_UPDATED.log APPEND
DECLARE
   precount   NUMBER;
   nowcount   NUMBER;
BEGIN
    SELECT COUNT(*) INTO precount FROM PLAN_OFFER_BK_PRE_SCRIPT WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';
    SELECT COUNT(*) INTO nowcount FROM PLAN_OFFER WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';

    dbms_output.put_line('precount: ' || precount || ',  nowcount:' || nowcount );
END;
/

SPOOL OFF

SQL * Plusでスクリプトに変数を渡す。スクリプト、たとえば、1.sql

set serveroutput on feedback off verify off
define CLIENTID=&1

SPOOL logs\MVP_MEC_UPDATED.log APPEND
DECLARE
   precount   NUMBER;
   nowcount   NUMBER;
BEGIN
    SELECT COUNT(*) INTO precount FROM PLAN_OFFER_BK_PRE_SCRIPT WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';
    SELECT COUNT(*) INTO nowcount FROM PLAN_OFFER WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';

    dbms_output.put_line('CLIENTID: ' || '&CLIENTID' || ', precount: ' || precount || ',  nowcount:' || nowcount );
END;
/

SPOOL OFF
exit

それを呼び出す:

sqlplus -s user/password @1.sql 101

ここで、101はCLIENTIDです。または:

sqlplus -s user/password @1.sql %CLIENTID%

どこ %CLIENTID%は、バッチスクリプト内の変数です。

2
Balazs Papp

&& CLIENTID && precountおよび&& nowcountの入力を求められますか?

あなたの問題の原因はそこにあると思います。

Precountとnowcountの結果を表示したい場合は、次のことを試してください。

サーバー出力をオンに設定

DECLARE
   precount   NUMBER;
   nowcount   NUMBER;
BEGIN
    SELECT COUNT(*) INTO precount FROM PLAN_OFFER_BK_PRE_SCRIPT WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';
    SELECT COUNT(*) INTO nowcount FROM PLAN_OFFER WHERE COV_IN = 'Y' AND PLAN_IN = 'Y';
dbms_output.put_line(precount);
dbms_output.put_line(nowcount);

END;
/
0