1

これに相当する SQL を Oracle で実行しようとしています。基本的に、特定の列の値を変数に入れ、それらの変数を使用してテーブルをクエリする必要があります

DECLARE @transID INT
       ,@pol_no varchar(20)

SELECT @pol_no = 'xxx'

SELECT @transID = p.transID 
  FROM policy_dimension p 
 WHERE p.pol_no = @pol_no

SELECT pd.* 
  FROM property_dimension pd 
 WHERE pd.trans_id = @transID

私はこれを試しました

DECLARE 
  policy_no VARCHAR2(20);
  transaction_id int;
BEGIN
  :policy_no := '20P0000175';

  SELECT pd_transaction_id
    INTO transaction_id
    FROM policy_dimension p
   WHERE p.pd_policy_no = :policy_no
     AND ROWNUM = 1 
   ORDER BY pd_transaction_id desc;

   BEGIN
     SELECT *
       FROM property_dimension pd
      WHERE pd.pd_transaction_id = :transaction_id;
   END;


END;
/
4

3 に答える 3

0

コロンを失う

DECLARE 
  v_policy_no VARCHAR2(20);
  v_transaction_id number;
  v_some_value number;
BEGIN 
 -- no colon here ( :policy_no )
  v_policy_no := '20P0000175';

  SELECT pd_transaction_id
    INTO v_transaction_id -- no colon here
    FROM policy_dimension p
   WHERE p.pd_policy_no = v_policy_no -- no colon here
     AND ROWNUM = 1 
   ORDER BY pd_transaction_id desc;

   BEGIN
     SELECT some_column into v_some_value
       FROM property_dimension pd
      WHERE pd.pd_transaction_id = v_transaction_id; -- no colon here
   END;


END;
/
于 2012-10-15T16:37:38.180 に答える
0

:変数の前の記号はそれをBind変数にしますが、あなたの場合は必要ありません。PLSQLSELECTブロック内では結果がそのまま表示されません。結果セットのすべてのレコードをループし、dbms_outputパッケージを呼び出して出力を表示する必要があります。したがって、以下のように PLSQL ブロックを少し変更するだけで機能するはずです。

SET SERVEROUTPUT ON
DECLARE 
  policy_no VARCHAR2(20);
  transaction_id int;
BEGIN
  policy_no := '20P0000175';

 BEGIN             --Since the select query can return no rows which will cause this Block to fail, use proper exception handling
    SELECT pd_transaction_id
      INTO transaction_id
      FROM policy_dimension p
     WHERE p.pd_policy_no = policy_no
       AND ROWNUM = 1 
     ORDER BY pd_transaction_id desc;
 EXCEPTION
 WHEN NOTFOUND THEN
     dbms_output.put_line ('No pd_transaction_id found');
     transaction_id := '0';
 END;

   FOR c_rec in (SELECT *
                   FROM property_dimension pd
                  WHERE pd.pd_transaction_id = transaction_id) --Notice the LOOP
   LOOP
    dbms_output.put_line ('Displaying - ' || c_rec.column1 ||' '||c_rec.column2||....); --Display every row with columns column1, column2 , column3.... as the column names
   END LOOP;
END;
/
于 2012-10-15T18:14:07.737 に答える
0

このコード表示(他の列pd_transaction_idproperty_dimensionわかりません):

set serveroutput on -- need to display message using dbms_output.put_line
DECLARE 
  policy_no VARCHAR2(20);
  transaction_id int;
  cur_pd_transaction_id int;

  CURSOR cur (param VARCHAR2)  -- cursor with parameter
  is       
    SELECT pd_transaction_id /*You can add here more columns*/
    FROM property_dimension pd
    WHERE pd.pd_transaction_id = param;
begin
   policy_no := '20P0000175';

   SELECT pd_transaction_id
     INTO transaction_id -- set policy_dimension.pd_transaction_id to transaction_id
    FROM policy_dimension p
    WHERE p.pd_policy_no = policy_no; 

   open cur(transaction_id); -- open cursor with parameter transaction_id
   fetch cur into cur_pd_transaction_id;    
    LOOP
    FETCH cur INTO cur_pd_transaction_id;
       EXIT WHEN cur%NOTFOUND;
       dbms_output.put_line('pd_transaction_id: '||cur_pd_transaction_id);
   END LOOP;

   close cur;  
end;

以下はそれを行う簡単な方法です:

set serveroutput on
DECLARE 
  policy_no VARCHAR2(20);
  transaction_id int;
begin
   policy_no := '20P0000175';

   SELECT pd_transaction_id
     INTO transaction_id 
    FROM policy_dimension p
    WHERE p.pd_policy_no = policy_no; 

   for cur in ( SELECT *
                FROM property_dimension pd
                WHERE pd.pd_transaction_id = transaction_id)   
    LOOP
       dbms_output.put_line('pd_transaction_id: '||cur.pd_transaction_id);
   END LOOP;

end;

カーソルの詳細については、こちらを参照してください。

于 2012-10-15T17:42:37.690 に答える