2012-02-28 38 views
1

どのように私はDV_NOのデータ型がvarchar型で、Date_Dvが日付であるPL/SQLにT-SQLの変換

set @disbursement_no = (select isnull(max(convert(numeric, right(DV_NO, 6))), 0) + 1 
      from CD_T_DV_HDR where year(DATE_DV) = year(getdate())) 

PL/SQLに次のT-SQLステートメントを変換することができます。

私はPL/SQLの新機能です。私はSQL文をPL/SQLに変換するのに苦労しています。あなたが私を助けてくれることを願っています。

答えて

3

それはこのようになります:

DECLARE 
    disbursement_no NUMBER; 
BEGIN 
    SELECT (coalesce(MAX(To_number(Substr(dv_no, -6, 6))), 0)) + 1 
    INTO disbursement_no 
    FROM cd_t_dv_hdr 
    WHERE To_char(date_dv, 'rrrr') = To_char(SYSDATE, 'rrrr'); 
END; 

Substr(dv_no, -6, 6)は右端の6つの文字を取得します。 to_numberは、文字列をnumberに変換します。 maxは最大数をフェッチします& coalesce結果の数値がヌルであるかどうかをチェックします。&をゼロに変換します。

+0

ありがとうございました.... –

-1
DECLARE 
    disbursement_no int; 
BEGIN 
    select (case when DV_NO is null 0 else max(to_number(right(DV_NO,6),'999999')) end)+1 into disbursement_no 
    from CD_T_DV_HDR 
    where extract(year from DATE_DV) = extract(year from current_date); 
END; 

私はかなりそれをすると思います。私はそこに他の方法があると確信していますが、isnull()のpostgresqlに相当するかもしれませんが、もしあれば私はそれを知りません。明らかに、いくつかのリターンなど、残りの関数が必要になるでしょう。

PostgreSQLのテキストタイプは、他のシステムと同等以上にスマートで、varcharは通常テキストで置き換えることができます特別な考慮事項です。

これは頻繁に、クエリの場合はまた、あなたは、where句にインデックスを作成することができます表現に基づいて作成したインデックス:

create index my_year_index on CD_T_DV_HDR (extract(year from DATE_DV)); 

これは、PostgreSQLの本当に素晴らしい機能の1つです。

+1

Postgresの中間例90% 2.使用中の機能-badアイデアを使用しますか? PL/SQLはOracleの拡張です - [PostgresはPL/pgSQLです](http://en.wikipedia.org/wiki/PL/pgSQL) – Sathya

0

@ Sathyaのコメントに関する1つのこと: DATE_DVがパーティション化されたキー列として索引付け/使用される場合Oracleは、列に機能があるため索引/パーティションを使用しません。 これは、テーブル全体で不良となるフルテーブルスキャンを引き起こします。

あなたは2つのオプションがあります: 1.変更インデックス/パーティションはあなたの条件

SELECT (coalesce(MAX(To_number(Substr(dv_no, -6, 6))), 0)) + 1 
INTO disbursement_no 
FROM cd_t_dv_hdr 
WHERE date_dv between trunc(sysdate,'rrrr') and trunc(add_months(sysdate,12),'rrrr')