3

私のプロジェクトでは、次のクエリを実行しようとしています:

DECLARE
  Sid nvarchar2(30) := ''; /*Here the values will come from some other variable>*/
  Bid nvarchar2(30) := ''; /*Here the values will come from some other variable>*/
  ExecuteDSQL varchar2(1000);
  ExecuteDSQLResult varchar2(10000);
BEGIN

  IF Sid IS NULL THEN Sid := '1' ; ELSE Sid := '4' ; END IF;
  IF Bid IS NULL THEN Bid := '1' ; ELSE Bid := '5' ; END IF;

  ExecuteDSQL := '  SELECT * FROM iftlog WHERE serverid='''|| Sid
                 || ''' AND bpid=''' || Bid  || '''  ';

  EXECUTE IMMEDIATE ExecuteDSQL INTO ExecuteDSQLResult;

  DBMS_OUTPUT.PUT_LINE(ExecuteDSQLResult);

END;
/

クエリの結果、一貫性のないデータ型のエラーが発生します。このエラーに加えて、MS-SQL のように一時テーブルに結果を格納できるかどうかという問題があります。私はOracleデータベースを初めて使用します。1 から 20 までのレコードを格納するための一時テーブルが必要です。Row_Number() を使用し、それに応じてプロジェクトでクエリを変更します。

4

3 に答える 3

3

SQL Server の一時テーブルに相当する Oracle は、PL/SQL コレクションです。この構文を使用して%rowtype、テーブルのプロジェクションに一致するローカル タイプを定義できます。その型を使用して、ローカル変数を選択のターゲットとして宣言できます。

残念ながら、レコードを出力するための便利なメカニズムはありません。DBMS_OUTPUT.PUT_LINE() 呼び出しで個々の列を指定する必要があります。

idomatic PL/SQL で書き直したコードを次に示します。

DECLARE 

    Sid nvarchar2(30) := '';/*Here the values will come from some other variable>*/
    Bid nvarchar2(30) := '';/*Here the values will come from some other variable>*/

    ExecuteDSQL varchar2(1000) := 'SELECT * FROM iftlog WHERE serverid= :1 AND bpid= :2';
    type iftlog_nt is table of  iftlog%rowtype;

    ExecuteDSQLResult iftlog_nt;

BEGIN

    IF Sid IS NULL THEN Sid := '1' ; ELSE Sid := '4' ; END IF;
    IF Bid IS NULL THEN Bid := '1' ; ELSE Bid := '5' ; END IF;

    EXECUTE IMMEDIATE ExecuteDSQL 
        bulk collect into ExecuteDSQLResult
        using sid and bid;

    -- loop through all records in PL/SQL table
    for idx in 1..ExecuteDSQLResult.count()
    loop
        DBMS_OUTPUT.PUT_LINE(ExecuteDSQLResult(idx).some_col||'::'||ExecuteDSQLResult(idx).some_other_col);
    end loop;

END;
/

もちろん、このようにコードを書き直すと、動的 SQL がまったく必要ないことが明らかになります。したがって、EXECUTE IMMEDIATE 呼び出しを単純な選択に置き換えることができます。

SELECT * 
bulk collect into ExecuteDSQLResult 
FROM iftlog 
WHERE serverid= sid 
AND bpid= bid;
于 2015-08-09T12:11:43.620 に答える
2

Oracle使用できます

  1. Object type/table typeまた
  2. 動的カーソル

オブジェクト型/テーブル型の使用

CREATE TYPE obj_typ AS OBJECT ( 
   id          number,
   name        VARCHAR2(20)
);
/

CREATE TYPE tab_typ AS table of  obj_typ;
/

declare
    v_type  tab_typ :tab_typ();
    .....
begin
    .....
    execute immediate 'select obj_typ(id, name) from tbl' into v_type;
    .....
end;

のように使用できるv_typeようになりました。temp table

select id from table(v_type);

タイプの制限の 1 つは、使用する前にスキーマで作成する必要があることです。

動的カーソルの使用

sql_stmt := 'SELECT * FROM emp WHERE job = :j';
OPEN emp_cv FOR sql_stmt USING my_job;

データを賭けるためにループする必要がある制限はcursor、それほど柔軟ではありませんtemp table

于 2015-08-09T12:07:43.527 に答える