1

あなたが助けてくれることを願っています - 私は変数に日付を割り当てようとしており、選択クエリでその変数を呼び出しています。私が投稿しているコードは、私がやろうとしていることの一部にすぎません。その変数を複数回呼び出します。グーグルで助けを求めようとしましたが、すでに非常に多くの選択があるため、Select Into ステートメントの使用に固執しています。

DECLARE 
    CurrMonth DATE := '27 may 2012'; -- Enter 27th of current month  

BEGIN

SELECT 
    a.policynumber
    ,a.cifnumber
    ,a.phid
    ,a.policystartdate
    ,b.sistartdate
    ,c.dateofbirth
    ,'28/02/2013' AS TaxYearEnd
    --Complete tax year end in the SELECT statement (once for tax year end and once for the age at tax year end)
    ,round ((months_between('28 feb 2013',c.dateofbirth)/12),8) AS AgeAtTaxYearEnd 
    ,b.sifrequency AS CurrSIFrequ
    ,b.sivalue AS CurrentSIValue
    ,b.simode AS CurrentSIMode
    ,d.anniversarydate AS CurrentAnnDate
    ,d.anniversaryvalue AS CurrentAnnValue
    ,b.ruleeffectivedate
    ,b.sistatus AS CurrentSIStatus
    ,b.paymentbranchcode AS CurrSIBranchCode
    ,b.transferaccounttype AS CurrSIAccountType
    ,b.transferaccountnumber AS CurrSIAccountNo
    ,SUM(k.unitbalance) AS unitbalance
    ,a.latestrule
FROM fcislob.policytbl a
    ,fcislob.policysitbl b
    ,fcislob.unitholderdetailtbl c
    ,fcislob.policyanniversaryvaluetbl d
    ,fcislob.unitholderfundtbl k
WHERE a.policynumber = b.policynumber
    AND a.policynumber = d.policynumber
    AND b.policynumber = d.policynumber
    AND a.phid = c.unitholderid
    AND a.phid = k.unitholderid
    AND c.unitholderid = k.unitholderid
    AND a.ruleeffectivedate = b.ruleeffectivedate
    AND a.ruleeffectivedate = d.ruleeffectivedate
    AND b.ruleeffectivedate = d.ruleeffectivedate
    AND a.latestrule <> 0
    AND c.authrejectstatus = 'A'        
    AND a.phid LIKE 'AGLA%'
    AND b.sistatus <> 'C'
    AND k.unitbalance >0     
    AND b.transactiontype = '64'
    AND b.sistartdate <= CurrMonth                                              
    AND b.sifrequency = 'M'

GROUP BY a.policynumber, a.cifnumber, a.phid, a.policystartdate, b.sistartdate , c.dateofbirth,b.sifrequency, b.sivalue, b.simode, d.anniversarydate, d.anniversaryvalue, b.ruleeffectivedate,
    b.sistatus, b.paymentbranchcode, b.transferaccounttype, b.transferaccountnumber, b.policynumber, a.latestrule;
    END;
4

2 に答える 2

3
  1. 句があるgroup byので、集計されていないすべての列でグループ化する必要があります。
  2. 結果にレコードが1つしかないことを確認しますか?
  3. @TonyAndrewsが言ったように、into句が必要です。すべての列に対して変数を宣言し、それに挿入する必要があります。

すなわち:

DECLARE
  v_policynumber fcislob.policytbl.policynumber%TYPE;
  v_cifnumber    fcislob.policytbl.cifnumber%TYPE;
  v_phid         fcislob.policytbl.phid%TYPE;
  -- and so on ...
  v_sum          number;
BEGIN
    SELECT SUM(k.unitbalance), a.policynumber, a.cifnumber, a.phid -- and so on ...
      INTO v_sum, v_policynumber, v_cifnumber, v_phid -- and so on ...
      FROM fcislob.policytbl a -- and so on ...
  GROUP BY a.policynumber, a.cifnumber, a.phid -- and so on ...
END;
  1. 日付の処理方法は「健全」ではto_dateありません。IMOを使用する方が適切であり、NLSパラメーターを実際に使用することはできません。
于 2012-05-30T11:54:49.270 に答える
0

selectPL/SQL のみを使用して、いくつかの単純なステートメント間で日付値を保持できるようにしている場合、非常に複雑select intoになります。クエリの結果を表示するだけの場合、特に複数の行。

多くの選択があるとおっしゃっていたので、スクリプト ファイル ( example.sql) にそれらがあり、SQL*Plus などでそれらを実行していると思いsqlplus user/password @exampleます。その場合は、単純な SQL ステートメントを保持し、位置パラメーター置換変数、またはバインド変数を使用して日付を追跡できます。

最初のオプションは、次のようにコマンドラインで日付を渡したい場合ですsqlplus user/password @example 27-May-2012

set verify off
select 'Supplied date is ' || to_date('&1', 'DD-Mon-RRRR') from dual;

これは、 として参照される最初の位置パラメータを使用&1し、クエリで必要に応じて日付に変換します。渡された日付は、関数が期待する形式である必要がありますto_date。この場合は、DD-Mon-RRRR を作成しました。変数は一重引用符で囲む必要があることに注意してください。そうしないと(数値でない限り)、Oracleは値ではなく列名として解釈しようとします。(set verify off置換変数が使用されるたびに、SQL*Plusがデフォルトで表示するメッセージを抑制します)。

&1スクリプト内で何度でも参照できますが、意味のある名前で再定義する方が簡単な場合があります。複数の位置パラメーターがある場合に特に便利です。その後、その名前をクエリで使用します。

define supplied_date = &1
select 'Supplied date is ' || to_date('&supplied_date', 'DD-Mon-RRRR') from dual;

コマンドラインから日付を渡したくない場合は、代わりに固定値を使用できます。ここでは、別のデフォルトの日付形式を使用しています。これにより、日付リテラル構文またはto_date関数を使用できます。

define curr_date = '2012-05-31';
select 'Today is ' || date '&curr_date' from dual;
select 'Today is ' || to_date('&curr_date', 'YYYY-MM-DD') from dual;

あるクエリの結果を後のクエリで使用して、日付値を取得することができます。column ... new_valueこれを行うには、 SQL*Plus コマンドを使用できます。curr_dateこれは、将来のクエリからの列 (エイリアス) の文字列値を持つ置換変数を定義todayし、同じ方法で使用できます。

column today new_value curr_date
select to_char(sysdate, 'DD-Mon-YYYY') as today from dual;
select 'Today is ' || to_date('&curr_date', 'DD-Mon-YYYY') from dual;

var[iable]コマンドで定義し、で設定するバインド変数を使用することもできますexec

var curr_date varchar2(10);
exec :curr_date := '2012-05-31';
select 'Today is ' || to_date(:curr_date, 'YYYY-MM-DD') from dual;

(exec実際には無名PL/SQLブロックのラッパーなので、意味begin :curr_date := '2012-05-31'; end;しますが、実際にはエラーが発生した場合にのみ表示されます)。バインド変数が文字列であることを認識しているため、これを一重引用符で囲まないことに注意してください。

組み合わせることができるので、コマンド ラインで日付を渡した場合は、バインド変数に割り当てることができますexec :supplied_date := '&1'。または現在の日付を使用しますexec :curr_date := to_char(sysdate, 'YYYY-MM-DD')

多くの組み合わせが可能なので、あなたがやろうとしていることに合ったものを選ぶ必要があります。これらのすべてではないにしても、ほとんどはSQL Developerでも機能するはずですが、他のクライアントについてはわかりません。

于 2012-05-31T08:32:31.520 に答える