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未満の乱数を取得します。あるいは、 X
が low
以上、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;
カスタム UDF オーバーロード¶
セットアップデータ¶
DBMS_RANDOM
スキーマを作成する必要があります。
CREATE SCHEMA IF NOT EXISTS DBMS_RANDOM
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
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();
$$;
注意: UDF は、およそ9桁から10桁の小数部(9桁または10桁の精度)のみをサポートしています。
使用例¶
Oracle
SELECT DBMS_RANDOM.VALUE() FROM DUAL;
|DBMS_RANDOM.VALUE() |
|--------------------------------------------|
|0.47337471168356406022193430290380483126 |
注意: 関数は、_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;
|DBMS_RANDOM.VALUE() |
|--------------------|
|0.1014560867 |
注意: 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);
$$;
注意:
Oracleの DBMS_RANDOM.VALUE(low, high)関数は、パラメーターの順序を指定する必要がないため、Snowflake UDF は、常に最高と最低の数値を取り出すことでこの機能をサポートするように実装されています。
UDF は、およそ9桁から10桁の小数部(9桁または10桁の精度)しかサポートしていません。
使用例¶
Oracle
SELECT DBMS_RANDOM.VALUE(-10,30) FROM DUAL;
|DBMS_RANDOM.VALUE(-10,30) |
|--------------------------------------------|
|16.0298681859960167648070354679783928085 |
Snowflake
SELECT
--** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
DBMS_RANDOM.VALUE_UDF(-10,30) FROM DUAL;
|DBMS_RANDOM.VALUE(-10,30) |
|----------------------------|
|-6.346055187 |
既知の問題¶
問題は見つかりませんでした。
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);
カスタムプロシージャ¶
セットアップデータ¶
DBMS_OUTPUT
スキーマを作成する必要があります。
CREATE SCHEMA IF NOT EXISTS DBMS_OUTPUT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
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;
$$;
注意:
これは仮テーブルを使用していることに注意してください。セッション終了後もデータを持続させたい場合は、 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();
|DBMS_OUTPUT.PUT_LINE('test') |
|-----------------------------|
|test |
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();
|ROW |WHEN |DATABASE |LOG |
|----|------------------------|------------|---------|
| 1 |2022-04-25 11:16:23.844 |CODETEST |test |
既知の問題¶
UDF のコードは、パフォーマンスに影響する可能性があるため、コメントアウトされたままになっています。ユーザーがこのコードを使用すると決めた場合は、コメントを解除するだけです。
ユーザーは、UDF を変更し、必要な情報を DBMS_OUTPUT.PUT_LINE テーブルに挿入することができます。
関連 EWIs¶
SSC-FDM-OR0035: DBMS_OUTPUT.PUT_LINE_UDF のための UDF の実装を確認してください。
DBMS_LOB¶
説明¶
DBMS_LOB
パッケージは、 BLOBs
、 CLOBs
、 NCLOBs
、 BFILEs
、仮 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;
関数のオーバーロード¶
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;
1 |2 |3 |4 |5 |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
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;
1 |2 |3 |4 |5 |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
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;
1 |2 |3 |4 |5 |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
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;
1 |2 |3 |4 |5 |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
注意: 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;
1 |2 |3 |4 |5 |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
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;
1 |2 |3 |4 |5 |6|
---------------+----+-------------+-----+----+-+
some magic here|some|me magic here|magic|here| |
注意: UTL_RAW.CAST_TO_RAW()
は現在、TO_BINARY()
に変換されていません。関数は、例の機能的同等性を示すために使用されます。
DBMS_LOB.SUBSTR(BFILE, 量, オフセット)¶
使用例
BFILE 列で DBMS_LOB.SUBSTR()を使用すると、ファイルのコンテンツの部分文字列が返されます。
次の例は現在の移行 ではなく、BFILE タイプに対する SUBSTR 関数の違いを示すための機能的な例です。
ファイルのコンテンツ(file.txt):
some magic here
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;
DBMS_OUTPUT.PUT_LINE(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(fil,4,1))) |
-------------------------------------------------------------------------|
some magic |
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;
$$;
SUBSTR(bfile_column, 1, 9) |
---------------------------|
MY_DIR\fi |
既知の問題¶
1.BFILE 列で DBMS_LOB.SUBSTR を使用する¶
列の BFILE データ型に対する現在の変換は VARCHAR で、ファイル名は文字列として格納されます。したがって、変換後の BFILE 列に SUBSTR 関数を適用すると、ファイル名の部分文字列が返されますが、Oracleではファイルのコンテンツの部分文字列が返されます。
関連 EWIs¶
SSC-EWI-OR0076: 組み込みパッケージがサポートされていません。
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.FOPEN
プロシージャ
構文¶
UTL_FILE.FCLOSE(
FILE VARCHAR
);
セットアップデータ¶
UTL_FILE
スキーマを作成する必要があります。
CREATE SCHEMA IF NOT EXISTS UTL_FILE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
ファイルをダウンロードしたい場合は、以下のコマンドを実行してください。
GET @UTL_FILE.utlfile_local_directory/<filename> file://<path_to_file>/<filename>;
GET コマンドは Snowflake CLI で実行されます。
カスタムプロシージャオーバーロード¶
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 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;
この例を実行するには、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;
既知の問題¶
1. Modify the procedure for changing the name of the stage.¶
ステージ名を変更する必要がある場合、ユーザーはプロシージャを変更することができます。
2.場所 静的。¶
このプロシージャへの書き込みに使用される場所は静的です。プロシージャの新しいバージョンでは、 FILE
パラメーターを持つ場所を使用することで、その拡張性を高めることが期待されています。
5.ファイルはサポートされています。¶
このプロシージャは今のところ、.CSV ファイルのみを書き込みます。
関連 EWIs¶
SSC-FDM-0015: データ型が認識されません。
SSC-FDM-OR0036: 不要な組み込みパッケージパラメーター。
FOPEN プロシージャ¶
説明¶
このプロシージャはファイルを開きます。(Oracle PL/SQL UTL_FILE.FOPEN)
このプロシージャはテキストファイルを保存するためにSnowflake STAGE を使用して実装されています。
ユーザーは、プロシージャで使用するローカルファイルを STAGE にアップロードする必要があります。
このプロシージャは以下と組み合わせて使用する必要があります。
UTL_FILE.FCLOSE
プロシージャ
構文¶
UTL_FILE.FOPEN(
LOCATION VARCHAR,
FILENAME VARCHAR,
OPEN_MODE VARCHAR,
MAX_LINESIZE NUMBER,
);
セットアップデータ¶
UTL_FILE
スキーマを作成する必要があります。
CREATE SCHEMA IF NOT EXISTS UTL_FILE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
ステージ
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;
OPEN_MODE
パラメーターの値が w または r の場合、utlfile_local_directory
にファイルをアップロードする必要があります。
PUT file://<path_to_file>/<filename> @UTL_FILE.utlfile_local_directory auto_compress=false;
PUT コマンドは Snowflake CLI で実行されます。
カスタムプロシージャオーバーロード¶
UTL_FILE.FOPEN( VARCHAR, VARCHAR)¶
パラメーター
FILENAME: ファイル名。拡張子**.** を含む
OPEN_MODE: ファイルを開く方法を指定します。
オープンモード
Oracle組み込みパッケージUTL_FILE.FOPEN
プロシージャは、ファイルを開く方法として6つのモードをサポートしていますが、Snowscriptingプロシージャでサポートされているのはそのうちの3つだけです。
OPEN_MODE | DESCRIPTION | STATUS |
---|---|---|
w | Write mode | Supported |
a | Append mode | Supported |
r | Read mode | Supported |
rb | Read byte mode | Unsupported |
wb | Write byte mode | Unsupported |
ab | Append byte mode | Unsupported |
機能性
このプロシージャでは、ファイルを開く操作をエミュレートする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 INTO
の内部ステージに実装されています。
使用例¶
Oracle
DECLARE
w_file UTL_FILE.FILE_TYPE;
BEGIN
w_file:= UTL_FILE.FOPEN('MY_DIR','test.csv','w',1024);
END;
この例を実行するには、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;
既知の問題¶
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¶
SSC-FDM-0015: データ型が認識されません。
SSC-FDM-OR0036: UnnecessaryBuiltInPackagesParameters
PUT_LINE プロシージャ¶
説明¶
このプロシージャは、バッファーパラメーターに格納されているテキスト文字列を、ファイルハンドルによって識別されるオープンファイルに書き込みます。(Oracle PL/SQL UTL_FILE.PUT_LINE)
このプロシージャは以下と組み合わせて使用する必要があります。
UTL_FILE.FOPEN
プロシージャUTL_FILE.FCLOSE
プロシージャ
構文¶
UTL_FILE.PUT_LINE(
FILE VARCHAR,
BUFFER VARCHAR,
);
セットアップデータ¶
UTL_FILE
スキーマを作成する必要があります。
CREATE SCHEMA IF NOT EXISTS UTL_FILE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}';
カスタム 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;
注意:
このプロシージャを使用するには、 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;
この例を実行するには、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;
既知の問題¶
1. AUTOFLUSH
parameter is not used.¶
Oracle組み込みパッケージUTL_FILE.PUT_LINE
プロシージャには AUTOFLUSH
パラメーターがありますが、Snowscriptingプロシージャでは使用されないため削除されます。
関連 EWIs¶
SSC-FDM-0015: データ型が認識されません。
SSC-FDM-OR0036: UnnecessaryBuiltInPackagesParameters