PROCEDURE set_env(enVar IN STRING, value IN STRING)
复制
在 Inceptor 中有一些系统预定义的函数/过程/包,可以用来直接调用,此外,我们可以通过相关命令随时查看系统内预定义的函数/过程/包的有关信息,具体查看方法可参见注意事项章节。
Inceptor 中一共有十个系统预定义的函数/过程,如下所示,我们将分章节介绍每一个函数/过程的具体内容及使用方法。
需要注意的是,Inceptor 中仅支持部分系统预定义的异常,也就是说对于 sqlcode,sqlerrm 函数,并非每一种异常发生,都会返回相对应的 Error code 和 Error message。 Inceptor 对于系统预定义异常的支持情况,可仔细阅读异常章节,获取更多信息。 |
set_env
语法格式
Inceptor 中,set_env(string,string) 是一个过程:
-
形参 enVar 的参数类型为 IN,数据类型为字符串,用来存放环境变量的名称。
-
形参 value 的参数类型为 IN,数据类型为字符串,相应地用来存放环境变量的值。
使用示例
get_env
语法格式
get_env(string) 是一个函数,该函数用来返回 set_env 中环境变量的所对应的值。
FUNCTION get_env(enVar IN STRING) RETURN STRING
复制
-
形参 enVar 的参数类型为 IN,数据类型为字符串。
使用示例
!set plsqlUseSlash true DECLARE a STRING b STRING BEGIN -- 调用过程 set_env,定义一个名为 aa 的环境变量,值为 hello。 set_env('aa','hello') -- 调用函数 get_env,获取环境变量 aa 的值,并赋值给 a。 a := get_env('aa') -- 输出变量 a 的值,可以发现变量 a 与环境变量 aa 的值相同。 DBMS_OUTPUT.PUT_LINE('the value of a is: '||a) set_env('bb','world') b:= get_env('bb') DBMS_OUTPUT.PUT_LINE('the value of b is: '||b) END; /
复制
输出结果为:
+---------------------------+ | output | +---------------------------+ | the value of a is: hello | | the value of b is: world | +---------------------------+
复制
sqlcode()
语法格式
sqlcode() 是一个不带参数的函数,用来返回当异常发生时,当前异常的 Error code。
FUNCTION sqlcode() RETURN INT
复制
使用示例
!set plsqlUseSlash true DECLARE test_record transactions%rowtype v_code INT v_errm STRING BEGIN SELECT * INTO test_record FROM transactions WHERE acc_num=6513065; dbms_output.put_line(test_record.trans_time) EXCEPTION WHEN TOO_MANY_ROWS THEN -- 当异常发生时,获取当前异常的 Error code,并赋值给变量 v_code。 v_code := sqlcode() dbms_output.put_line('error code is: ' ||v_code) END; /
复制
输出结果为:
+-----------------------+ | output | +-----------------------+ | error code is: -1422 | +-----------------------+
复制
sqlerrm()
语法格式
不带参数的 sqlerrm() 函数,用来返回当异常发生时,当前异常的 Error message。
FUNCTION sqlerrm() RETURN STRING
复制
使用示例
!set plsqlUseSlash true DECLARE test_record transactions%rowtype v_code INT v_errm STRING BEGIN SELECT * INTO test_record FROM transactions WHERE acc_num=6513065; dbms_output.put_line(test_record.trans_time) EXCEPTION WHEN TOO_MANY_ROWS THEN -- 当异常发生时,获取当前异常的 Error message,并赋值给变量 v_errm。 v_errm := sqlerrm() dbms_output.put_line('error message is: ' ||v_errm) END; /
复制
输出结果为:
+----------------------------------+ | output | +----------------------------------+ | error message is: TOO_MANY_ROWS | +----------------------------------+
复制
sqlerrm
语法格式
带参数的 sqlerrm(int),用来返回既定 Error code 下的 Error message。
FUNCTION sqlerrm(errCode IN INT) RETURN STRING
复制
-
errCode:指定 Error code。
使用示例
!set plsqlUseSlash true DECLARE test_record transactions%rowtype v_code INT v_errm STRING BEGIN SELECT * INTO test_record FROM transactions WHERE acc_num=6513065; dbms_output.put_line(test_record.trans_time) EXCEPTION WHEN TOO_MANY_ROWS THEN -- 当异常 -1422 发生时,获取对应异常的 Error message,并赋值给变量 v_errm。 v_errm := sqlerrm(-1422) dbms_output.put_line('error message of -1422 is: ' ||v_errm) END; /
复制
输出结果为:
+-------------------------------------------+ | output | +-------------------------------------------+ | error message of -1422 is: TOO_MANY_ROWS | +-------------------------------------------+
复制
get_columns
语法格式
-
作为函数使用,get_columns(string,nestedtable<string>)返回数据表中的列名。
FUNCTION get_columns(table IN STRING) RETURN
复制 -
作为过程使用,get_columns(string,nestedtable<string>) 返回数据表的列名。其中 columns 参数表示排除的字段,即哪些字段不在结果中显示。
PROCEDURE default.get_columns_test(columns IN STRING)
复制
使用示例
-- 最终输出的字符串 s 的值,与最开始的值相比,少了最后一个列名之后的逗号。 !set plsqlUseSlash true CREATE OR REPLACE PROCEDURE get_columns_test() IS TYPE nest_table is TABLE of STRING TYPE nest_table_1 is TABLE of STRING -- 声明一个已定义好的 nest_table 类型的变量 a_table。 a_table nest_table -- 声明一个已定义好的 nest_table1 类型的变量 b_table,默认为 null 值。 b_table nest_table_1 default null s string BEGIN -- 给变量 a_table 赋值。 a_table := nest_table('this','is','a','table','ID') -- 使用 get_columns 函数,获取表 transactions 的列名,并赋值给变量 b_table。 b_table := get_columns("transactions") DBMS_OUTPUT.PUT_LINE('a_table:') -- 依次打印出变量 a_table 的值。 FOR i in a_table.first() .. a_table.last() LOOP DBMS_OUTPUT.PUT_LINE(a_table(i)) END LOOP; IF b_table is not null THEN -- 将变量 b_table 的值用逗号连接起来,并赋值给变量 s。 FOR i in b_table.first() .. b_table.last() LOOP s := s || b_table(i) || ", " END LOOP; END; DBMS_OUTPUT.PUT_LINE('b_table:') -- instr 函数返回字符串 s 中从右往左数第一次出现逗号的位置,设为 m,substr 函数是从字符串 s 中第一个字符开始截取长度为 m-1 的字符串。 -- 用于去除最后一个逗号“,” s := substr(s,1,oracle_instr(s,',',-1)-1) DBMS_OUTPUT.PUT_LINE(s) END; / BEGIN get_columns_test() END; /
复制
输出结果为:
+---------------------------------------------------------------------+ | output | +---------------------------------------------------------------------+ | a_table: | | this | | is | | a | | table | | ID | | b_table: | | trans_id, acc_num, trans_time, trans_type, stock_id, price, amount | +---------------------------------------------------------------------+
复制
raise_application_error
语法格式
在Inceptor PL/SQL 中,可以使用预定义函数 raise_application_error(int,string[,bool]),来抛出带有指定 error code, error message 的异常:
FUNCTION raise_application_error(errorCode IN INT, msg IN STRING[, keepExistError IN BOOL]) RETURN EXCEPTION
复制
-
目前第三个参数 keepExistError 是可选的,且没有任何作用。
使用示例
!set plsqlUseSlash true DECLARE num_tables INT BEGIN -- 查询表 transactions 的行数,并赋值给变量 num_tables。 SELECT COUNT(*) INTO num_tables FROM transactions; IF num_tables < 1000 THEN -- 如果表 transactions 的行数小于 1000,则抛出异常。 RAISE_APPLICATION_ERROR (-20101, 'Expecting at least 1000 tables') ELSE -- 否则,就输出表 transactions 的行数。 dbms_output.put_line(num_tables) END IF END; /
复制
输出结果为:
EXECUTION FAILED: Task EXEC PLSQL error PLException: [Error -20101] Expecting at least 1000 tables ********************************************* System function raise_application_error (LINE -1, COLUMN -1, TEXT "null") ANONYMOUS BLOCK (LINE 8, COLUMN 5, TEXT "RAISE_APPLICATION_ERROR (-20101, 'Expecting at least 1000 tables')") *********************************************复制
!set plsqlUseSlash true DECLARE num_tables INT BEGIN -- 查询表 transactions 的行数,并赋值给变量 num_tables。 SELECT COUNT(*) INTO num_tables FROM transactions; IF num_tables < 10 THEN -- 如果表 transactions 的行数小于 10,则抛出异常。 RAISE_APPLICATION_ERROR (-20101, 'Expecting at least 1000 tables') ELSE -- 否则,就输出表 transactions 的行数。 dbms_output.put_line(num_tables) END IF END; /
复制
输出结果为:
+---------+ | output | +---------+ | 20 | +---------+
复制
PUT_LINE
语法格式
Inceptor 中,put_line(string) 是一个过程,形参 msg 的参数类型为 IN,数据类型为字符串,该过程用来打印出字符串的值。
PROCEDURE dbms_output.put_line(msg IN STRING)
复制
注意事项
-
在 Inceptor 中使用 PUT_LINE 函数时,如果程序正常运行,则 PUT_LINE 会统一打印到终端。
-
如果程序运行过程中出现了未被处理的异常,可以设置相关命令,将 PUT_LINE 正常打印出的内容连同异常栈一起打印到终端。
-
更多用法说明,可参见注意事项章节。
使用示例
!set plsqlUseSlash true -- 创建名为 put_line_test 的函数,形参 v1 的数据类型为整数型,返回值为双精度类型。 CREATE OR REPLACE FUNCTION put_line_test(v1 int) RETURN DOUBLE IS v2 DOUBLE v3 STRING BEGIN -- 使用 put_line 函数,打印出 null 值。 put_line(null) DBMS_OUTPUT.PUT_LINE(v1) v2 := 2 v3 := "I'm a string." put_line(v2) -- 使用 put_line 函数,打印出变量 v2 的值。 DBMS_OUTPUT.PUT_LINE('v2: ' || v2) -- 使用 put_line 函数,打印出字符串 v2+v1。 put_line('v2 + v1') DBMS_OUTPUT.PUT_LINE(v2 + v1) -- 使用 put_line 函数,打印出 v3 的值。 put_line(v3) v3 := null DBMS_OUTPUT.PUT_LINE(v3) -- 函数返回值为 v1 和 v2 的乘积。 return v2 * v1 END; / BEGIN dbms_output.put_line("Executing put_line_test(1)") -- 使用 put_line 函数,打印出 put_line_test(1) 的全部值。 put_line(put_line_test(1)) END; /
复制
输出结果:
+-----------------------------+ | output | +-----------------------------+ | Executing put_line_test(1) | | null | | 1 | | 2.0 | | v2: 2.0 | | v2 + v1 | | 3.0 | | I'm a string. | | null | | 2.0 | +-----------------------------+
复制
dbms_output
语法格式
dbms_output 包内有一个过程,该过程可以实现将字符(包括变量和常量)的值打印出来,我们通常调用包内过程,来打印变量或者常量的值。
PACKAGE dbms_output IS PROCEDURE dbms_output.put_line(msg IN STRING) PACKAGE BODY dbms_output IS PROCEDURE dbms_output.put_line(msg IN STRING)
复制
注意事项
-
Inceptor 中,包 dbms_output 是系统预定义的,包内只有一个名为 put_line 的过程,且 put_line 过程也是系统预定义的。
-
在实际的使用中,可以直接调用过程 put_line 打印结果,也可以调用包内过程 put_line 来打印结果。
使用示例
调用包内过程 put_line。
!set plsqlUseSlash true BEGIN FOR test IN 1..5 LOOP dbms_output.put_line('test:'||test) END LOOP; END; /
复制
输出结果为:
+---------+ | output | +---------+ | test:1 | | test:2 | | test:3 | | test:4 | | test:5 | +---------+
复制
owa_util
语法格式
在 Inceptor 中,系统预定义包 owa_util,仅支持包内过程 who_called_me,有四个形参,参数类型均为 OUT 类型,每次调用包内过程 who_called_me 时,每一个形参都会获得一个具体的值,即实参。
PACKAGE owa_util IS PROCEDURE owa_util.who_called_me(owner OUT STRING, name OUT STRING, lineno OUT INT, type OUT STRING) PACKAGE BODY owa_util IS PROCEDURE owa_util.who_called_me(owner OUT STRING, name OUT STRING, lineno OUT INT, type OUT STRING)
复制
-
owner 是存储过程的创建者信息。
-
name 是存储过程调用者的名字信息。
-
lineno 是调用语句在调用者中的行号。
-
type 通常表明程序的类型,包括 ANONYMOUS_BLOCK, FUNCTION, PROCEDURE, PACKAGE BODY。
使用示例
!set plsqlUseSlash true -- 创建一个名为 outer_proc() 的过程。 CREATE OR REPLACE PROCEDURE outer_proc() IS -- 分别声明四个变量。 v_owner STRING v_name STRING v_lineno INT v_type STRING BEGIN DBMS_OUTPUT.PUT_LINE('Outer outer proc') -- 调用包内过程 owa_util.who_called_me,其中 v_owner, v_name, v_lineno, v_type 分别用来储存相对应形参所获得的值。 owa_util.who_called_me(v_owner, v_name, v_lineno, v_type) -- 依次输出四个变量的值。 DBMS_OUTPUT.PUT_LINE('Owner: ' || v_owner) DBMS_OUTPUT.PUT_LINE('Name: ' || v_name) DBMS_OUTPUT.PUT_LINE('Lineno: ' || v_lineno) DBMS_OUTPUT.PUT_LINE('Type: ' || v_type) END; / BEGIN outer_proc() END; /
复制
输出结果为:
+------------------------+ | output | +------------------------+ | Outer outer proc | | Owner: | | Name: | | Lineno: 2 | | Type: ANONYMOUS_BLOCK | +------------------------+
复制