SnowConvert: Oracle組み込みパッケージ

説明

Oracleは、データベースの機能を拡張し、SQL 機能への PL/SQL アクセスを提供するために、PL/SQL パッケージをOracleサーバーとともに多数提供しています。(Oracle PL/SQL 組み込みパッケージ)

DBMS_RANDOM

説明

DBMS_RANDOM パッケージは組み込みの乱数生成器を提供します。DBMS_RANDOM は暗号用ではありません。(Oracle PL/SQL DBMS_RANDOM)

VALUE 関数

説明

基本関数は、0以上1未満の乱数を取得します。あるいは、 Xlow 以上、high 未満であるOracle乱数 X を取得することもできます。(Oracle PL/SQL DBMS_RANDOM.VALUE)

この UDF は、Oracle DBMS_RANDOM.VALUE 関数の機能を複製するため、Javascriptの Math.random 関数を使用して実装しています。

構文
DBMS_RANDOM.VALUE()
    RETURN NUMBER;

DBMS_RANDOM.VALUE(
    low NUMBER,
    high NUMBER)
    RETURN NUMBER;
Copy

カスタム UDF オーバーロード

セットアップデータ

DBMS_RANDOM スキーマを作成する必要があります。

CREATE SCHEMA IF NOT EXISTS DBMS_RANDOM
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
Copy
DBMS_RANDOM.VALUE()

パラメーター

  • パラメーターはありません。

CREATE OR REPLACE FUNCTION DBMS_RANDOM.VALUE_UDF()
RETURNS DOUBLE
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$  
  return Math.random();
$$;
Copy

注意: UDF は、およそ9桁から10桁の小数部(9桁または10桁の精度)のみをサポートしています。

使用例

Oracle

SELECT DBMS_RANDOM.VALUE() FROM DUAL;
Copy
|DBMS_RANDOM.VALUE()                         |
|--------------------------------------------|
|0.47337471168356406022193430290380483126    |
Copy

注意: 関数は、_DBMS_RANDOM.VALUE()_ または _ DBMS_RANDOM.VALUE._ のいずれかで呼び出すことができます

Snowflake

SELECT
--** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
DBMS_RANDOM.VALUE_UDF() FROM DUAL;
Copy
|DBMS_RANDOM.VALUE() |
|--------------------|
|0.1014560867        |
Copy

注意: Snowflakeでは、括弧を付ける必要があります。

DBMS_RANDOM.VALUE(NUMBER, NUMBER)

パラメーター

  • low: 乱数が生成される NUMBER の最低値。生成される数値は low 以上です。

  • high: 乱数を生成する際の制限値として使用される NUMBER の最高値。生成される数値は high よりも小さくなります。

CREATE OR REPLACE FUNCTION DBMS_RANDOM.VALUE_UDF(low double, high double)
RETURNS DOUBLE
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
    if (LOW > HIGH) {
        [LOW, HIGH] = [HIGH, LOW];
    }
    
    const MAX_DECIMAL_DIGITS = 38;
    return (Math.random() * (HIGH - LOW) + LOW).toFixed(MAX_DECIMAL_DIGITS);
$$;
Copy

注意:

  • Oracleの DBMS_RANDOM.VALUE(low, high)関数は、パラメーターの順序を指定する必要がないため、Snowflake UDF は、常に最高と最低の数値を取り出すことでこの機能をサポートするように実装されています。

  • UDF は、およそ9桁から10桁の小数部(9桁または10桁の精度)しかサポートしていません。

使用例

Oracle

SELECT DBMS_RANDOM.VALUE(-10,30) FROM DUAL;
Copy
|DBMS_RANDOM.VALUE(-10,30)                   |
|--------------------------------------------|
|16.0298681859960167648070354679783928085    |
Copy

Snowflake

SELECT
--** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
DBMS_RANDOM.VALUE_UDF(-10,30) FROM DUAL;
Copy
|DBMS_RANDOM.VALUE(-10,30)   |
|----------------------------|
|-6.346055187                |
Copy

既知の問題

問題は見つかりませんでした。

DBMS_OUTPUT

説明

DBMS_OUTPUT パッケージは特に PL/SQL デバッグ情報を表示するのに便利です。(Oracle PL/SQL DBMS_OUTPUT)

PUT_LINE プロシージャ

説明

このプロシージャはバッファーに行を配置します。(Oracle PL/SQL DBMSOUTPUT.PUT_LINE)

この UDF は、Oracle DBMS_OUTPUT.PUT_LINE 関数の機能を複製するために、表示するデータを挿入する仮テーブルを使用して実装されています。

構文
DBMS_OUTPUT.PUT_LINE(LOG VARCHAR);
Copy

カスタムプロシージャ

セットアップデータ

DBMS_OUTPUT スキーマを作成する必要があります。

CREATE SCHEMA IF NOT EXISTS DBMS_OUTPUT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
Copy
DBMS_OUTPUT.PUT_LINE(VARCHAR)

パラメーター

  • LOG: 表示したいバッファーの項目。

CREATE OR REPLACE procedure DBMS_OUTPUT.PUT_LINE_UDF(LOG VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS $$
   
  //Performance may be affected by using this UDF.
  //If you want to start logging information, please uncomment the implementation.
  //Once the calls of DBMS_OUTPUT.PUT_LINE have been done, please use
  //the following query to read all the logs:
  //SELECT * FROM DBMS_OUTPUT.DBMS_OUTPUT_LOG.

  //snowflake.execute({sqlText:`
  //CREATE TEMPORARY TABLE IF NOT EXISTS DBMS_OUTPUT_LOG 
  //(
  //  WHEN TIMESTAMP,
  //  DATABASE VARCHAR,
  //  LOG VARCHAR
  //);`});

  //snowflake.execute({sqlText:`INSERT INTO DBMS_OUTPUT_LOG(WHEN, DATABASE, LOG) VALUES (CURRENT_TIMESTAMP,CURRENT_DATABASE(),?)`, binds:[LOG]});
  return LOG;
$$;
Copy

注意:

  • これは仮テーブルを使用していることに注意してください。セッション終了後もデータを持続させたい場合は、 CREATE TABLE から TEMPORARY を削除してください。

  • 仮テーブル には、永続的でない一時的なデータが格納されます。それらは作成されたセッション内にのみ存在し、そのセッションの残りの期間だけ持続します。セッション終了後、テーブルに保存されたデータはシステムから完全に削除されるため、テーブルを作成したユーザーでもSnowflakeでも復旧することはできません。

仮テーブルを使用しない場合、混乱を避けるために、 USER の実行 DBMS_OUTPUT.PUT_LINE UDF が挿入されるテーブルに別の列が必要な場合があることに留意してください。

使用例

Oracle

CREATE OR REPLACE PROCEDURE PROC 
IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Test');
END;

CALL PROC();
Copy
|DBMS_OUTPUT.PUT_LINE('test') |
|-----------------------------|
|test                         |
Copy

Snowflake

CREATE OR REPLACE PROCEDURE PROC ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        --** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
        CALL DBMS_OUTPUT.PUT_LINE_UDF('Test');
    END;
$$;

CALL PROC();
Copy
|ROW |WHEN                    |DATABASE    |LOG      |
|----|------------------------|------------|---------|
| 1  |2022-04-25 11:16:23.844 |CODETEST    |test     |
Copy

既知の問題

  • UDF のコードは、パフォーマンスに影響する可能性があるため、コメントアウトされたままになっています。ユーザーがこのコードを使用すると決めた場合は、コメントを解除するだけです。

  • ユーザーは、UDF を変更し、必要な情報を DBMS_OUTPUT.PUT_LINE テーブルに挿入することができます。

関連 EWIs

  1. SSC-FDM-OR0035: DBMS_OUTPUT.PUT_LINE_UDF のための UDF の実装を確認してください。

DBMS_LOB

説明

DBMS_LOB パッケージは、 BLOBsCLOBsNCLOBsBFILEs、仮 LOBs を演算するサブプログラムを提供します。DBMS_LOB を使用して、 LOB または完全な LOBs の特定の部分にアクセスし、操作することができます。(Oracle PL/SQL DBMS_LOB)

SUBSTR 関数

説明

この関数は、 LOB の先頭からの絶対 オフセット を起点として、 LOB の バイトまたは文字を返します。(Oracle PL/SQL DBMS_LOB.SUBSTR)

この組み込み関数は、Snowflake SUBSTR 関数 に置き換えられます。しかし、いくつかの違いがあります。

注意: および オフセット パラメーターは、Snowflakeでは反転しています

構文
DBMS_LOB.SUBSTR (
   lob_loc     IN    BLOB,
   amount      IN    INTEGER := 32767,
   offset      IN    INTEGER := 1)
  RETURN RAW;

DBMS_LOB.SUBSTR (
   lob_loc     IN    CLOB   CHARACTER SET ANY_CS,
   amount      IN    INTEGER := 32767,
   offset      IN    INTEGER := 1)
  RETURN VARCHAR2 CHARACTER SET lob_loc%CHARSET;

DBMS_LOB.SUBSTR (
   file_loc     IN    BFILE,
   amount      IN    INTEGER := 32767,
   offset      IN    INTEGER := 1)
  RETURN RAW;
Copy

関数のオーバーロード

DBMS_LOB.SUBSTR('文字列', 量, オフセット)

使用例

Oracle

SELECT 
-- 1. "some magic here"
DBMS_LOB.SUBSTR('some magic here', 15, 1) "1",
-- 2. "some"
DBMS_LOB.SUBSTR('some magic here', 4, 1) "2",
-- 3. "me magic here"
DBMS_LOB.SUBSTR('some magic here', 15, 3) "3",
-- 4. "magic"
DBMS_LOB.SUBSTR('some magic here', 5, 6) "4",
-- 5. "here"
DBMS_LOB.SUBSTR('some magic here', 20, 12) "5",
-- 6. " "
DBMS_LOB.SUBSTR('some magic here', 250, 16) "6"
FROM DUAL;
Copy
1              |2   |3            |4    |5   |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
Copy

Snowflake

SELECT
-- 1. "some magic here"
SUBSTR('some magic here', 1, 15) "1",
-- 2. "some"
SUBSTR('some magic here', 1, 4) "2",
-- 3. "me magic here"
SUBSTR('some magic here', 3, 15) "3",
-- 4. "magic"
SUBSTR('some magic here', 6, 5) "4",
-- 5. "here"
SUBSTR('some magic here', 12, 20) "5",
-- 6. " "
SUBSTR('some magic here', 16, 250) "6"
FROM DUAL;
Copy
1              |2   |3            |4    |5   |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
Copy
DBMS_LOB.SUBSTR(B LOB, 量, オフセット)

使用例

注意: OracleおよびSnowflakeの結果値は、関数を理解しやすくするためにバイトから文字列に変換されています。

Snowflake の場合は以下を使用することを検討してください。

hex_decode_string( to_varchar(SUBSTR(blob_column, 1, 6), 'HEX'));

また、 Oracle の場合は以下を使用することを検討してください。

utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(blob_column, 1, 6));

結果を文字列として取得します。

Oracle

-- Create Table
CREATE TABLE blobtable( blob_column BLOB );

-- Insert sample value
INSERT INTO blobtable VALUES (utl_raw.cast_to_raw('some magic here'));

-- Select different examples
SELECT 
-- 1. "some magic here"
DBMS_LOB.SUBSTR(blob_column, 15, 1) "1",
-- 2. "some"
DBMS_LOB.SUBSTR(blob_column, 4, 1) "2",
-- 3. "me magic here"
DBMS_LOB.SUBSTR(blob_column, 15, 3) "3",
-- 4. "magic"
DBMS_LOB.SUBSTR(blob_column, 5, 6) "4",
-- 5. "here"
DBMS_LOB.SUBSTR(blob_column, 20, 12) "5",
-- 6. " "
DBMS_LOB.SUBSTR(blob_column, 250, 16) "6"
FROM BLOBTABLE;
Copy
1              |2   |3            |4    |5   |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
Copy

Snowflake

-- Create Table
CREATE OR REPLACE TABLE blobtable ( blob_column BINARY
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

-- Insert sample value
INSERT INTO blobtable
VALUES (
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'utl_raw.cast_to_raw' IS NOT CURRENTLY SUPPORTED. ***/!!!
'' AS cast_to_raw);

-- Select different examples
SELECT
-- 1. "some magic here"
SUBSTR(blob_column, 1, 15) "1",
-- 2. "some"
SUBSTR(blob_column, 1, 4) "2",
-- 3. "me magic here"
SUBSTR(blob_column, 3, 15) "3",
-- 4. "magic"
SUBSTR(blob_column, 6, 5) "4",
-- 5. "here"
SUBSTR(blob_column, 12, 20) "5",
-- 6. " "
SUBSTR(blob_column, 16, 250) "6"
FROM
BLOBTABLE;
Copy
1              |2   |3            |4    |5   |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
Copy

注意: UTL_RAW.CAST_TO_RAW() は現在、TO_BINARY() に変換されていません。関数は、例の機能的同等性を示すために使用されます。

DBMS_LOB.SUBSTR(CLOB, 量, オフセット)

使用例

Oracle

-- Create Table
CREATE TABLE clobtable(clob_column CLOB);

-- Insert sample value
INSERT INTO clobtable VALUES ('some magic here');

-- Select
SELECT 
-- 1. "some magic here"
DBMS_LOB.SUBSTR(clob_column, 15, 1) "1",
-- 2. "some"
DBMS_LOB.SUBSTR(clob_column, 4, 1) "2",
-- 3. "me magic here"
DBMS_LOB.SUBSTR(clob_column, 15, 3) "3",
-- 4. "magic"
DBMS_LOB.SUBSTR(clob_column, 5, 6) "4",
-- 5. "here"
DBMS_LOB.SUBSTR(clob_column, 20, 12) "5",
-- 6. " "
DBMS_LOB.SUBSTR(clob_column, 250, 16) "6"
FROM clobtable;
Copy
1              |2   |3            |4    |5   |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
Copy

Snowflake

-- Create Table
CREATE OR REPLACE TABLE clobtable (clob_column VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

-- Insert sample value
INSERT INTO clobtable
VALUES ('some magic here');

-- Select
SELECT
-- 1. "some magic here"
SUBSTR(clob_column, 1, 15) "1",
-- 2. "some"
SUBSTR(clob_column, 1, 4) "2",
-- 3. "me magic here"
SUBSTR(clob_column, 3, 15) "3",
-- 4. "magic"
SUBSTR(clob_column, 6, 5) "4",
-- 5. "here"
SUBSTR(clob_column, 12, 20) "5",
-- 6. " "
SUBSTR(clob_column, 16, 250) "6"
FROM
clobtable;
Copy
1              |2   |3            |4    |5   |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
Copy

注意: UTL_RAW.CAST_TO_RAW() は現在、TO_BINARY() に変換されていません。関数は、例の機能的同等性を示すために使用されます。

DBMS_LOB.SUBSTR(BFILE, 量, オフセット)

使用例

BFILE 列で DBMS_LOB.SUBSTR()を使用すると、ファイルのコンテンツの部分文字列が返されます。

次の例は現在の移行 ではなく、BFILE タイプに対する SUBSTR 関数の違いを示すための機能的な例です。

ファイルのコンテンツ(file.txt):

some magic here
Copy

Oracle

CREATE OR REPLACE PROCEDURE bfile_substr_procedure
IS
    fil BFILE := BFILENAME('MY_DIR', 'file.txt');
BEGIN
    DBMS_LOB.FILEOPEN(fil, DBMS_LOB.FILE_READONLY);
    DBMS_OUTPUT.PUT_LINE(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(fil,9,1)));
    --Console Output:
    -- "some magi"
    DBMS_LOB.FILECLOSE(fil);
END;
Copy
DBMS_OUTPUT.PUT_LINE(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(fil,4,1))) |
-------------------------------------------------------------------------|
some magic                                                               |
Copy

Snowflake

BFILE 列は VARCHAR 列に変換されるため、同じ列に SUBSTR 関数を適用すると、ファイルのコンテンツではなく、ファイル名の部分文字列が返されます。

CREATE OR REPLACE PROCEDURE bfile_substr_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        fil VARCHAR := PUBLIC.BFILENAME_UDF('MY_DIR', 'file.txt');
    BEGIN
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_LOB.FILEOPEN' IS NOT CURRENTLY SUPPORTED. ***/!!!
        DBMS_LOB.FILEOPEN(:fil,
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_LOB.FILE_READONLY' IS NOT CURRENTLY SUPPORTED. ***/!!!
        '' AS FILE_READONLY);
        --** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
        CALL DBMS_OUTPUT.PUT_LINE_UDF(
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'UTL_RAW.CAST_TO_VARCHAR2' IS NOT CURRENTLY SUPPORTED. ***/!!!
        '' AS CAST_TO_VARCHAR2);
        --Console Output:
        -- "some magi"
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_LOB.FILECLOSE' IS NOT CURRENTLY SUPPORTED. ***/!!!
        DBMS_LOB.FILECLOSE(:fil);
    END;
$$;
Copy
SUBSTR(bfile_column, 1, 9) |
---------------------------|
MY_DIR\fi                  |
Copy

既知の問題

1.BFILE 列で DBMS_LOB.SUBSTR を使用する

列の BFILE データ型に対する現在の変換は VARCHAR で、ファイル名は文字列として格納されます。したがって、変換後の BFILE 列に SUBSTR 関数を適用すると、ファイル名の部分文字列が返されますが、Oracleではファイルのコンテンツの部分文字列が返されます。

関連 EWIs

  1. SSC-EWI-OR0076: 組み込みパッケージがサポートされていません。

  2. SSC-FDM-OR0035: DBMS_OUTPUT.PUTLINE UDF の実装を確認してください。

UTL_FILE

説明

UTL_FILE パッケージを使用すると、 PL/SQL プログラムでテキストファイルの読み書きができます。(Oracle PL/SQL UTL_FILE)

FCLOSE プロシージャ

説明

このプロシージャは、ファイルハンドルで識別されるオープンファイルを閉じます。(Oracle PL/SQL UTL_FILE.FCLOSE)

このプロシージャは書き込まれたテキストファイルを保存するためにSnowflake STAGE を使用して実装されています。

このプロシージャは以下と組み合わせて使用する必要があります。

構文
UTL_FILE.FCLOSE(
    FILE VARCHAR
    );
Copy
セットアップデータ
  • UTL_FILE スキーマを作成する必要があります。

CREATE SCHEMA IF NOT EXISTS UTL_FILE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
Copy
  • ファイルをダウンロードしたい場合は、以下のコマンドを実行してください。

GET @UTL_FILE.utlfile_local_directory/<filename> file://<path_to_file>/<filename>;
Copy

カスタムプロシージャオーバーロード

UTL_FILE.FCLOSE(VARCHAR)

パラメーター

  • FILE: UTL_FILE.FOPENの呼び出しから返されたアクティブなファイルハンドラー

機能性

このプロシージャは、UTL_FILE.FOPENプロシージャで作成された FOPEN_TABLES_LINES テーブルを使用します。

このプロシージャは、 FOPEN_TABLES_LINES にあるファイルから、同じ FHANDLE を持つすべての行をutlfile_local_directoryステージに書き込みます。

CREATE OR REPLACE PROCEDURE UTL_FILE.FCLOSE_UDF(FILE VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
     DECLARE
        fhandle VARCHAR;
        fileParse VARIANT;
        File_is_read_only exception;
        fileNameConcat VARCHAR;
        copyIntoQuery VARCHAR ;
    BEGIN
        fileParse:= PARSE_JSON(FILE);
        fhandle:= :fileParse:handle;
        fileNameConcat:= '@UTL_FILE.utlfile_local_directory/'||:fileParse:name;
        copyIntoQuery:= 'COPY INTO '||:fileNameConcat||' FROM (SELECT LINE FROM UTL_FILE.FOPEN_TABLES_LINES WHERE FHANDLE = ? ORDER BY SEQ) FILE_FORMAT= (FORMAT_NAME = my_csv_format COMPRESSION=NONE)   OVERWRITE=TRUE';
        EXECUTE IMMEDIATE :copyIntoQuery USING (fhandle);
        DELETE FROM UTL_FILE.FOPEN_TABLES_LINES WHERE FHANDLE = :fhandle;
        DELETE FROM UTL_FILE.FOPEN_TABLES WHERE FHANDLE = :fhandle;
    END
$$;
Copy

注意:

  • なお、このプロシージャでは、前回作成した ステージ を使用します。今のところ、別のステージでファイルを書き込みたい場合は、名前を変更する必要があります。

  • これらのプロシージャはCOPY INTOの内部ステージに実装されています。

使用例

Oracle

DECLARE 
    w_file UTL_FILE.FILE_TYPE;
BEGIN
    w_file:= UTL_FILE.FOPEN('MY_DIR','test.csv','w',1024);
    UTL_FILE.PUT_LINE(w_file,'New line');
    UTL_FILE.FCLOSE(w_file); 
END; 
Copy

この例を実行するには、ORACLE UTL_FILEを参照してください

Snowflake

DECLARE
    w_file OBJECT /*** SSC-FDM-0015 - REFERENCED CUSTOM TYPE 'UTL_FILE.FILE_TYPE' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/ := OBJECT_CONSTRUCT();
    call_results VARIANT;
BEGIN
    w_file:=
    --** SSC-FDM-OR0036 - PARAMETERS: 'LOCATION, MAX_LINESIZE_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
    UTL_FILE.FOPEN_UDF('MY_DIR','test.csv','w',1024);
    --** SSC-FDM-OR0036 - PARAMETERS: 'AUTOFLUSH_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
    call_results := (
        CALL UTL_FILE.PUT_LINE_UDF(:w_file,'New line')
    );
    call_results := (
        CALL UTL_FILE.FCLOSE_UDF(:w_file)
    );
    RETURN call_results;
END;
Copy

既知の問題

1. Modify the procedure for changing the name of the stage.

ステージ名を変更する必要がある場合、ユーザーはプロシージャを変更することができます。

2.場所 静的。

このプロシージャへの書き込みに使用される場所は静的です。プロシージャの新しいバージョンでは、 FILE パラメーターを持つ場所を使用することで、その拡張性を高めることが期待されています。

5.ファイルはサポートされています。

このプロシージャは今のところ、.CSV ファイルのみを書き込みます。

関連 EWIs

  1. SSC-FDM-0015: データ型が認識されません。

  2. SSC-FDM-OR0036: 不要な組み込みパッケージパラメーター。

FOPEN プロシージャ

説明

このプロシージャはファイルを開きます。(Oracle PL/SQL UTL_FILE.FOPEN)

このプロシージャはテキストファイルを保存するためにSnowflake STAGE を使用して実装されています。

ユーザーは、プロシージャで使用するローカルファイルを STAGE にアップロードする必要があります。

このプロシージャは以下と組み合わせて使用する必要があります。

構文
UTL_FILE.FOPEN(
    LOCATION VARCHAR,
    FILENAME VARCHAR,
    OPEN_MODE VARCHAR,
    MAX_LINESIZE NUMBER,
    );
Copy
セットアップデータ
  • UTL_FILE スキーマを作成する必要があります。

CREATE SCHEMA IF NOT EXISTS UTL_FILE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
Copy
  • ステージ utlfile_local_directory を作成します。

CREATE OR REPLACE FILE FORMAT  my_csv_format TYPE = csv;

CREATE OR REPLACE STAGE utlfile_local_directory
  file_format = my_csv_format;
Copy
  • OPEN_MODE パラメーターの値が w または r の場合、 utlfile_local_directory にファイルをアップロードする必要があります。

PUT file://<path_to_file>/<filename> @UTL_FILE.utlfile_local_directory auto_compress=false;
Copy

カスタムプロシージャオーバーロード

UTL_FILE.FOPEN( VARCHAR, VARCHAR)

パラメーター

  • FILENAME: ファイル名。拡張子**.** を含む

  • OPEN_MODE: ファイルを開く方法を指定します。

オープンモード

Oracle組み込みパッケージUTL_FILE.FOPENプロシージャは、ファイルを開く方法として6つのモードをサポートしていますが、Snowscriptingプロシージャでサポートされているのはそのうちの3つだけです。

OPEN_MODEDESCRIPTIONSTATUS
wWrite modeSupported
aAppend modeSupported
rRead modeSupported
rbRead byte modeUnsupported
wbWrite byte modeUnsupported
abAppend byte modeUnsupported

機能性

このプロシージャでは、ファイルを開く操作をエミュレートする2つのテーブルを使用します。FOPEN_TABLES テーブルは開いているファイルを格納し、 FOPEN_TABLES_LINES テーブルは各ファイルが所有する行を格納します。

ファイルが書き込みモードでオープンされた場合、新しいファイルが作成され、読み込みモードまたは追加モードでオープンされた場合、 FOPEN_TABLES_LINES にファイルの行をロードし、 FOPEN_TABLES にファイルを挿入します。

CREATE OR REPLACE PROCEDURE UTL_FILE.FOPEN_UDF(FILENAME VARCHAR,OPEN_MODE VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS $$
    DECLARE
        fhandle VARCHAR;
        key VARCHAR;
        status VARCHAR;
        File_is_not_loaded_on_stage exception;
        fileNameConcat VARCHAR:= '@UTL_FILE.utlfile_local_directory/'||:FILENAME;
        copyIntoQuery VARCHAR DEFAULT 'COPY INTO UTL_FILE.FOPEN_TABLES_LINES (FHANDLE, LINE) FROM (SELECT ? , stageFile.$1 FROM '||:fileNameConcat||' stageFile)';
    BEGIN
        CREATE TABLE IF NOT EXISTS UTL_FILE.FOPEN_TABLES 
        (
          FHANDLE VARCHAR, 
          FILENAME VARCHAR,
          OPEN_MODE VARCHAR
        );

        CREATE TABLE IF NOT EXISTS UTL_FILE.FOPEN_TABLES_LINES 
        (
          SEQ    NUMBER AUTOINCREMENT,
          FHANDLE VARCHAR, 
          LINE    VARCHAR
        );   
        SELECT FHANDLE INTO fhandle FROM UTL_FILE.FOPEN_TABLES WHERE FILENAME = :FILENAME;
        SELECT UUID_STRING() INTO key;
        IF (OPEN_MODE = 'w') THEN
            INSERT INTO UTL_FILE.FOPEN_TABLES(FHANDLE, FILENAME, OPEN_MODE) VALUES(:key,:FILENAME,:OPEN_MODE);
            RETURN TO_JSON({ 'name': FILENAME, 'handle': key});
        ELSE
            IF (fhandle IS NULL) THEN
                EXECUTE IMMEDIATE :copyIntoQuery USING (key);
                SELECT OBJECT_CONSTRUCT(*):status INTO status FROM table(result_scan(last_query_id()));
                IF (status = 'LOADED') THEN
                    INSERT INTO UTL_FILE.FOPEN_TABLES(FHANDLE, FILENAME, OPEN_MODE) VALUES(:key,:FILENAME,:OPEN_MODE);
                    RETURN TO_JSON({'name': FILENAME, 'handle': key});
                ELSE
                    raise File_is_not_loaded_on_stage;
                END IF;
            ELSE
                UPDATE UTL_FILE.FOPEN_TABLES SET OPEN_MODE = :OPEN_MODE WHERE FHANDLE = :fhandle;
                RETURN TO_JSON({'name': FILENAME, 'handle': fhandle});
           END IF;
        END IF;     
    END
$$;
Copy

注意:

  • なお、このプロシージャでは、前回作成した ステージ を使用します。今のところ、ステージに別の名前を使いたい場合は、プロシージャを変更する必要があります。

  • これらのプロシージャはCOPY INTOの内部ステージに実装されています。

使用例

Oracle

DECLARE 
    w_file UTL_FILE.FILE_TYPE;
BEGIN
    w_file:= UTL_FILE.FOPEN('MY_DIR','test.csv','w',1024);
END;
Copy

この例を実行するには、ORACLE UTL_FILEを参照してください

Snowflake

DECLARE
    w_file OBJECT /*** SSC-FDM-0015 - REFERENCED CUSTOM TYPE 'UTL_FILE.FILE_TYPE' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/ := OBJECT_CONSTRUCT();
BEGIN
    w_file:=
    --** SSC-FDM-OR0036 - PARAMETERS: 'LOCATION, MAX_LINESIZE_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
    UTL_FILE.FOPEN_UDF('MY_DIR','test.csv','w',1024);
END;
Copy

既知の問題

1. Modify the procedure for changing the name of the stage.

ステージ名を変更する必要がある場合、ユーザーはプロシージャを変更することができます。

2. LOCATION parameter is not used.

プロシージャで使用されるステージは静的であるため、 LOCATION パラメーターは現在使用されていません。このパラメーターを使用して、開きたいファイルがあるステージの名前を入力することで、プロシージャの拡張性を高めるバージョンアップが計画されています。

3. MAX_LINESIZE parameter is not used

Oracle組み込みパッケージUTL_FILE.FOPENプロシージャには MAX_LINESIZE パラメーターがありますが、Snowscriptingプロシージャでは使用されないため削除されます。

4. OPEN_MODE values supported

このプロシージャは、write (w)、read (r)、append (a)モードでファイルを開くことができます。

5.ファイルはサポートされています

このプロシージャは今のところ、.CSV ファイルにのみ対応しています。

関連 EWIs

  1. SSC-FDM-0015: データ型が認識されません。

  2. SSC-FDM-OR0036: UnnecessaryBuiltInPackagesParameters

PUT_LINE プロシージャ

説明

このプロシージャは、バッファーパラメーターに格納されているテキスト文字列を、ファイルハンドルによって識別されるオープンファイルに書き込みます。(Oracle PL/SQL UTL_FILE.PUT_LINE)

このプロシージャは以下と組み合わせて使用する必要があります。

構文
UTL_FILE.PUT_LINE(
    FILE VARCHAR,
    BUFFER VARCHAR,
    );
Copy
セットアップデータ
  • UTL_FILE スキーマを作成する必要があります。

CREATE SCHEMA IF NOT EXISTS UTL_FILE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
Copy

カスタム UDF

UTL_FILE.PUT_LINE(VARCHAR, VARCHAR)

パラメーター

  • FILE: UTL_FILE.FOPENの呼び出しから返されたアクティブなファイルハンドラー

  • BUFFER: ファイル**.** に書き込むテキストを含むテキストバッファー

機能性

このプロシージャは、UTL_FILE.FOPENプロシージャで作成された FOPEN_TABLES_LINES テーブルを使用します。

ファイルの OPEN_MODE が_write_ (w)または_append_ (a)の場合、バッファーは FOPEN_TABLES_LINES に挿入されますが、 OPEN_MODE がread (r)の場合、 File_is_read_only 例外がスローされます。

CREATE OR REPLACE PROCEDURE UTL_FILE.PUT_LINE_UDF(FILE VARCHAR,BUFFER VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS $$
    DECLARE 
        openMode VARCHAR;
        openModeTemp VARCHAR;
        fhandle VARCHAR;
        fileParse VARIANT;
        File_is_read_only exception;
    BEGIN
        fileParse:= PARSE_JSON(FILE);
        fhandle:= :fileParse:handle;
        SELECT OPEN_MODE INTO openModeTemp FROM UTL_FILE.FOPEN_TABLES WHERE FHANDLE = :fhandle; 
        IF (openModeTemp = 'a' or openModeTemp = 'w') THEN
            INSERT INTO UTL_FILE.FOPEN_TABLES_LINES(FHANDLE,LINE) VALUES(:fhandle,:BUFFER);
        ELSE  
            raise File_is_read_only;
        END IF;
    END
$$;  

-- This SELECT is manually added and not generated by Snowconvert
SELECT * FROM UTL_FILE.FOPEN_TABLES_LINES;
Copy

注意:

  • このプロシージャを使用するには、 UTL_FILE.FOPENでファイルを開く必要があります

使用例

Oracle

DECLARE
    w_file UTL_FILE.FILE_TYPE;
BEGIN
    w_file:= UTL_FILE.FOPEN('MY_DIR','test.csv','w',1024);
    UTL_FILE.PUT_LINE(w_file,'New line');
END;
Copy

この例を実行するには、ORACLE UTL_FILEを参照してください

Snowflake

DECLARE
    w_file OBJECT /*** SSC-FDM-0015 - REFERENCED CUSTOM TYPE 'UTL_FILE.FILE_TYPE' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/ := OBJECT_CONSTRUCT();
    call_results VARIANT;
BEGIN
    w_file:=
    --** SSC-FDM-OR0036 - PARAMETERS: 'LOCATION, MAX_LINESIZE_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
    UTL_FILE.FOPEN_UDF('MY_DIR','test.csv','w',1024);
    --** SSC-FDM-OR0036 - PARAMETERS: 'AUTOFLUSH_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
    call_results := (
        CALL UTL_FILE.PUT_LINE_UDF(:w_file,'New line')
    );
    RETURN call_results;
END;
Copy

既知の問題

1. AUTOFLUSH parameter is not used.

Oracle組み込みパッケージUTL_FILE.PUT_LINEプロシージャには AUTOFLUSH パラメーターがありますが、Snowscriptingプロシージャでは使用されないため削除されます。

関連 EWIs

  1. SSC-FDM-0015: データ型が認識されません。

  2. SSC-FDM-OR0036: UnnecessaryBuiltInPackagesParameters