This function returns amount bytes or characters of a LOB, starting from an absolute offset from the beginning of the LOB. (Oracle PL/SQL DBMS_LOB.SUBSTR)
This built-in function is replaced with Snowflake SUBSTR function. However, there are some differences.
Note: The amount and offset parameters are inverted in Snowflake
Syntax
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_OUTPUT.PUT_LINE(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(fil,4,1))) |
-------------------------------------------------------------------------|
some magi |
Snowflake
BFILE columns are translated into VARCHAR columns, therefore applying a SUBSTR function on the same column would return a substring of the file name, not the file content.
OUT -> Oracle_04.sql
CREATE OR REPLACE PROCEDURE bfile_substr_procedure ()RETURNS VARCHARLANGUAGE SQLCOMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTE AS CALLERAS$$ 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;$$;
The current transformation for BFILE datatypes in columns is VARCHAR, where the name of the file is stored as a string. Therefore applying the SUBSTR function on a BFILE column after transformation will return a substring of the file name, while Oracle would return a substring of the file content.