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 INBLOB, amount ININTEGER:=32767, offset ININTEGER:=1)RETURNRAW;DBMS_LOB.SUBSTR ( lob_loc INCLOB CHARACTER SET ANY_CS, amount ININTEGER:=32767, offset ININTEGER:=1)RETURNVARCHAR2 CHARACTER SET lob_loc%CHARSET;DBMS_LOB.SUBSTR ( file_loc INBFILE, amount ININTEGER:=32767, offset ININTEGER:=1)RETURNRAW;
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
CREATEORREPLACEPROCEDURE bfile_substr_procedure ()RETURNSVARCHARLANGUAGESQLCOMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$DECLARE fil VARCHAR := PUBLIC.BFILENAME_UDF('MY_DIR', 'file.txt');BEGIN--** SSC-FDM-OR0041 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_LOB.FILEOPEN' IS NOT CURRENTLY SUPPORTED. ** DBMS_LOB.FILEOPEN(:fil,--** SSC-FDM-OR0041 - 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(--** SSC-FDM-OR0041 - TRANSLATION FOR BUILT-IN PACKAGE 'UTL_RAW.CAST_TO_VARCHAR2' IS NOT CURRENTLY SUPPORTED. **''AS CAST_TO_VARCHAR2);--Console Output:-- "some magi"--** SSC-FDM-OR0041 - 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.