2017-03-01 2 views
0

おかげでUSE変数...シンプルPL/SQL変数を作成 - 探しのためのWHERE句

を私はこれを研究して時間を費やしてきたし、私はそれが困難であるPL/SQLで何かをすることだと信じてすることはできませんTSQLで単純です。

私は2つのテーブルを結合単純なクエリを持っている:

 Select DISTINCT 
     to_char(TO_DATE('1899123000', 'yymmddhh24')+ seg.NOM_DATE, 'mm/dd/yyyy') AS "Record Date" 
    , cd.CODE 
    , EMP.ID 
    , EMP.SHORT_NAME 

    FROM 
    EWFM.GEN_SEG seg join EWFM.SEG_CODE cd ON seg.SEG_CODE_SK = cd.SEG_CODE_SK 
    join EMP on seg.EMP_SK = EMP.EMP_SK 
    where NOM_DATE = vMyDate; 

私はヒキガエル日付ポイントを使用して、私は、Oracle Exadataのソースに対してクエリを実行しています。結果のクエリは、QlikViewやTableauのような視覚化ツールにドロップされます。あなたがコードで見ることができるように、WHERE句を使うための簡単な変数を作りたいと思います。

この例では、NOM_DATEは、最初の行「Record Date」で確認できるように、42793(2/27/2017)などの整数です。何も新しいここでは、非常にエキサイティングな...まで...私はクエリをより動的にする変数を作成しようとしました。

ここで見つかった驚くほど多様な例を試しましたが、すべて失敗しました。以下のような:無効なSQL文

variable nomDate NUMBER; 
EXEC nomDate := 42793; 
select count(DET_SEG_SK) from DET_SEG 
where NOM_DATE = :nomDate; 

--ORA-00900:INTO句
declare myDate number(8); Begin myDate := 42793; --Fail ORA-06550が

variable nomDate NUMBER 
DEFINE nomDate = 42793 
EXEC : nomDate := ' & nomDate' 
...where NOM_DATE = (& nomDate) ; 

--ORA-00900期待されています:無効なSQLステートメント

といくつかのより多くのこと..うまくいけば、あなたはアイデアを得る。私は正しい答えのためにstackoverflowを研究するのに数時間を費やしましたが、あなたが見ることができるように、私はあなたに尋ねています。 "Var"のような単純な宣言からより複雑な "DECLARE、BEGIN、SELECT INTO ...."に実際に関数を作成するには、カーソルを使用して出力を反復する...私はまだ単純な変数をWhere句。

私の方法の誤りを説明してください。

--Forlorn SQL Devの

+0

を取得するには、まず、私はあなたがPL/SQL、TSQLないことを意味想定しています。第二に、私は最初の例を試しましたが、問題は見られません。わたしにはできる。だから私はそれが非常にシンプルな、または非常に奇妙な何かでなければならないと思う!全体(最初)の例をカット/ペーストできますか? – BobC

+0

PL/SQL(名前付きのパッケージ/プロシージャ/関数など)の内部では、 'declare'セクションに変数を宣言して、好きな場所で参照できます。あなたの例は、 '宣言mydate番号(8);'はうまく動作します( 'end;'が必要です)、 'select'ステートメントにのみ適用されるので' INTO節が期待されている 'ことがわかりません。 'variable'構文と' define'構文は、実際にはデスクトップアプリケーションによってさまざまな方法でエミュレートされるSQL * Plusコマンドラインツールのものですから、実行方法を説明する必要があるかもしれません。 –

+0

私の推測では、問題は変数宣言ではなく、レポート出力です - http://stackoverflow.com/questions/351489/is-it-possible-to-output-a-select-state-from-aのようなものです-pl-sql-block/351752 –

答えて

1

を使用することを好む

個人的にパッケージゲッターを使用するビューを使用します暗黙カーソルを使用している場合は、INTO変数を選択する必要があります。今私はあなたの変数のデータ型を知らないので、私はちょうどこの下の例で推測したが、うまくいけば、あなたはポイントを得る。

二つの他の事あなたがあなたの日付をTO_CHARingているのはなぜ

  1. を言及する必要があります。 DATEデータ型を使用するだけです。また、フォーマットマスクも間違っていると思います.1899123000はyymmddhh24と一致しません。
  2. 明示カーソルでは、正確に1つの行が必要です。 NO_DATA_FOUNDを取得します。 1よりも、あなたがTOO_MANY_ROWS
Declare 
    myDate number(8) := 42793; 
    /* These 4 variable data types are a guess */ 
    v_record_date varchar2(8); 
    v_cd_code varchar2(10); 
    v_emp_id number(4); 
    v_emp_short_name varchar2(100); 
BEGIN 
Select DISTINCT to_char(TO_DATE('1899123000', 'yymmddhh24') 
        + eg.NOM_DATE, 'mm/dd/yyyy') AS "Record Date" 
, cd.CODE 
, EMP.ID 
, EMP.SHORT_NAME 
INTO v_record_date, v_cd_code, v_emp_id, v_emp_short_name 
FROM EWFM.GEN_SEG seg 
join EWFM.SEG_CODE cd 
    ON seg.SEG_CODE_SK = cd.SEG_CODE_SK 
join EMP 
    on seg.EMP_SK = EMP.EMP_SK 
where NOM_DATE = myDate; 
END; 
/
0

あなたは、パッケージ内のゲッターとセッターとの変数を置きます。

は、その後、私は以来、私はテーブルからSELECT *を行うことができる方法コレクション(packagage.func(MYPARAM))

+1

この回答は問題を解決していないようです... – BobC

1
VARIABLE vMyDate NUMBER; 

BEGIN 
    :vMyDate := 42793; 
END; 
/

-- or 
-- EXEC :vMyDate := 42793; 

SELECT DISTINCT 
     TO_CHAR(DATE '1899-12-30' + seg.NOM_DATE, 'mm/dd/yyyy') AS "Record Date" 
    , cd.CODE 
    , EMP.ID 
    , EMP.SHORT_NAME 
FROM EWFM.GEN_SEG seg 
     join EWFM.SEG_CODE cd 
     ON seg.SEG_CODE_SK = cd.SEG_CODE_SK 
     join EMP 
     on seg.EMP_SK = EMP.EMP_SK 
WHERE NOM_DATE = :vMyDate; 
+0

ようこそ!私はそれをほぼ正確に/ ENDの後に省略しました。 (私はその行をブロックとして扱うSQL *コマンドの印象を受けていました)、失敗しました。私は/ and Bind Variableボックスを2回ポップアップしてもう一度やりました。私は両方の時間に正しい値を入力して、期待どおりに実行しました。 私はバインディング変数についてもっと学ぶ必要がありますが、これは正解に最も近いものです。 –