INSTR 函数
本函数返回LOB中从你指定的位置开始,第n个符合pattern的匹配的位置。VARCHAR2 缓冲区(pattern参数)的格式必须匹配CLOB参数的格式。换句话说,如果输入的LOB参数类型为NCLOB,缓冲区也必须包含NCHAR类型数据。 相反,如果输入LOB参数是CLOB类型,那么缓冲区必须包含CHAR类型数据。对于BFILE而言,文件必须已经成功使用FILEOPEN操作打开,本操作才能成功。接受RAW型或VARCHAR2型参数pattern匹配的操作,如INSTR,其pattern参数或子串不支持正则表达式或者特殊匹配字符(譬如SQL中的LIKE) 。语法DBMS_LOB.INSTR (lob_loc IN BLOB, //参数类型BLOBpattern IN RAW, //pattern类型RAWoffset IN INTEGER := 1, //开始位置,默认为1nth IN INTEGER := 1) //第N个匹配,默认为1RETURN INTEGER;
DBMS_LOB.INSTR (lob_loc IN CLOB CHARACTER SET ANY_CS, //参数类型CLOBpattern IN VARCHAR2 CHARACTER SET lob_loc%CHARSET, //pattern类型VARCHAR2offset IN INTEGER := 1, //开始位置,默认为1nth IN INTEGER := 1) //第N个匹配,默认为1RETURN INTEGER;
DBMS_LOB.INSTR (file_loc IN BFILE, //参数类型BFILEpattern IN RAW, //pattern类型RAWoffset IN INTEGER := 1, //开始,默认为1nth IN INTEGER := 1) //第N个匹配,默认为1RETURN INTEGER;
编译指示
pragma restrict_references(INSTR, WNDS, WNPS, RNDS, RNPS);
参数
参数 | 描述 |
---|---|
lob_loc | LOB的定位器 |
file_loc | LOB的文件类型定位器。 |
pattern | 要测试的Pattern。pattern对BLOB来说是一组 |
offset | 开始pattern匹配的位置,BLOB以字节为单位,CLOB以字符为单位,默认为1。 |
nth | 发现次数,从1开始 |
返回值
Table 23-30 INSTR Function Returns
返回 | 描述 |
---|---|
INTEGER | 从匹配pattern开始处的偏移量,以字节或字符为单位 pattern未找到返回0。 |
NULL | 可分以下情况: -一个或多个入参为NULL或者非法 -开始位置 < 1 或大于 > -nth < 1. - |
异常
Table 23-31 INSTR Function Exceptions for BFILES
异常 | 描述 |
---|---|
UNOPENED_FILE | 文件未处于打开状态 |
NOEXIST_DIRECTORY | 路径不存在 |
NOPRIV_DIRECTORY | 路径无权限 |
INVALID_DIRECTORY | 文件打开后,目录非法 |
INVALID_OPERATION | 文件不存在,或是对文件无权限 |
例子
CREATE OR REPLACE PROCEDURE Example_12a IS lobd CLOB; pattern VARCHAR2 := 'abcde'; position INTEGER := 10000; BEGIN -- get the LOB locator SELECT b_col INTO lobd FROM lob_table WHERE key_value = 21; position := DBMS_LOB.INSTR(lobd, pattern, 1025, 6); IF position = 0 THEN dbms_output.put_line('Pattern not found'); ELSE dbms_output.put_line('The pattern occurs at ' || position); END IF; END; CREATE OR REPLACE PROCEDURE Example_12b IS DECLARE fil BFILE; pattern VARCHAR2; pos INTEGER; BEGIN -- initialize pattern -- check for the 6th occurrence starting from 1025th byte SELECT f_lob INTO fil FROM lob_table WHERE key_value = 12; dbms_lob.fileopen(fil, dbms_lob.file_readonly); pos := dbms_lob.instr(fil, pattern, 1025, 6); dbms_lob.fileclose(fil); END;