3

SQL Server から Oracle への切り替え。ループ内の変数に文字列を連結するにはどうすればよいですか? SQL Serverでは、次のように書いていたでしょう

DECLARE @var varchar(max);
WHILE ([I'm doing something or whatever on a table])
BEGIN
    SET @var = @var + ' additional text';
END
SELECT @var AS 'result';

これは、これまでのストアド プロシージャで Oracle にあるものです。(NHibernate の ClassMap ファイルの autogen に進化させる予定です)

CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
   IS
   CURSOR TABLE_INFO_CUR
   IS
    SELECT 
        T.TABLE_NAME
        , C.COLUMN_NAME
        ,C.DATA_TYPE
        ,C.DATA_LENGTH
        ,C.DATA_PRECISION
        ,C.NULLABLE
    FROM 
        ALL_TABLES T
        JOIN
        ALL_TAB_COLUMNS C
            ON T.TABLE_NAME = C.TABLE_NAME
                AND T.OWNER = C.OWNER
    WHERE
        T.TABLE_NAME = :TABLE_NAME
        AND T.OWNER = :OWNER_NAME;
    TABLE_INFO_ROW TABLE_INFO_CUR%ROWTYPE;
    build_sql varchar2;
BEGIN
    --VARIABLE build_sql varchar2(4000);
    :build_sql := '';
    OPEN TABLE_INFO_CUR;

    LOOP
        FETCH TABLE_INFO_CUR INTO TABLE_INFO_ROW;
        EXIT WHEN TABLE_INFO_CUR%NOTFOUND;
        SELECT (:build_sql || ' ' || TABLE_INFO_ROW.TABLE_NAME || ' ' || TABLE_INFO_ROW.COLUMN_NAME || ' ' || TABLE_INFO_ROW.DATA_TYPE) INTO :build_sql;
    END LOOP;
    :CLASS_DEFINITION := :build_sql;  

    --DBMS_OUTPUT.put_line (CLASS_DEFINITION);


END;

ありがとう

4

2 に答える 2

1

build_sqlプロシージャ内の値でこれを行う場合は、先頭のコロンを省略します。これはパラメータ化された値のためのもので、ここでは適用されません。

build_sqlまた、先頭で変数の長さを宣言します。パラメーターの長さを省略できるため、これはちょっと混乱しますが、宣言された変数に対しては長さが必要です。

build_sqlこれは、操作を示す proc の切り刻まれたバージョンです。また、CLASS_DEFINITIONパラメーター変数にはコロンの接頭辞も付けないでください。

CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
IS
   ...
   build_sql varchar2(4000);
BEGIN
   build_sql := '';
   ...
   LOOP
      build_sql := build_sql || 'whatever';
   END LOOP;
   CLASS_DEFINITION := build_sql;  
END;

また、この行は必要ないことに注意してくださいbuild_sql := ''。変数の値はデフォルトで空白になります。または、宣言時に初期値を割り当てることができます。

CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
IS
   ...
   build_sql varchar2(4000) := 'start of my sql';
BEGIN
   ...
于 2013-06-26T19:06:50.323 に答える