2023年6月21日发(作者:)
达梦数据库学习之存储过程、存储函数、函数⼀、存储过程 1.概述 存储过程数据库系统中,⼀组为了完成特定功能的SQL 语句集,它存储在数据库中,⼀次编译后永久有效,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。存储过程是数据库中的⼀个重要对象。在数据量特别庞⼤的情况下利⽤存储过程能达到倍速的效率提升 2.语法 CREATE [OR REPLACE ] PROCEDURE<过程声明><模块体> <过程声明> ::= <存储过程名定义> [WITH ENCRYPTION][(<参数名><参数模式><参数类型> [<默认值表达式>] {,<参数名><参数模式><参数类型> [<默认值表达式>] })][<调⽤权限⼦句>] <存储过程名定义> ::=[<模式名>.]<存储过程名> ::= AS | IS <模块体> ::= [<声明部分>] BEGIN <执⾏部分> [<异常处理部分>] END [存储过程名] <声明部分> ::=[DECLARE]<声明定义>{<声明定义>} <声明定义>::=<变量声明>|<异常变量声明>|<游标定义>|<⼦过程定义>|<⼦函数定义>; <执⾏部分>::={;} ::= [<标号说明>]; <标号说明>::=<<<标号名>>> ::=|<控制语句> <异常处理部分>::=EXCEPTION<异常处理语句>{;<异常处理语句>} 注
可执⾏部分是存储过程的核⼼部分,由SQL语句和流控制语句构成。⽀持的SQL语句包括: 数据查询语句(SELECT) 数据操纵语句(INSERT、DELETE、UPDATE) 游标定义及操纵语句(DECLARE CURSOR、OPEN、FETCH、CLOSE) 事务控制语句(COMMIT、ROLLBACK) 动态SQL执⾏语句(EXECUTE IMMEDIATE) SQL语句必须以分号结尾,否则语法分析报错。⼆、存储函数 1.语法 CREATE [OR REPLACE ] FUNCTION <函数声明><模块体> <函数声明> ::= <存储函数名定义> [WITH ENCRYPTION][FOR CALCULATE][(<参数名><参数模式><参数类型> [<默认值表达式>]{,<参数名><参数模式><参数类型> [<默认值表达式>]})]RETURN <返回数据类型> [<调⽤选项⼦句>][PIPELINED] <存储函数名定义> ::=[<模式名>.]<存储函数名> <调⽤选项⼦句> ::= <调⽤选项> {<调⽤选项>} <调⽤选项> ::= <调⽤权限⼦句> | DETERMINISTIC ::= AS | IS <模块体> ::= [<声明部分>] BEGIN <执⾏部分> [<异常处理部分>] END [存储函数名] <声明部分> ::=[DECLARE]<声明定义>{<声明定义>} <声明定义>::=<变量声明>|<异常变量声明>|<游标定义>|<⼦过程定义>|<⼦函数定义>; <执⾏部分>::={;} ::= [<标号说明>]; <标号说明>::=<<<标号名>>> ::=|<控制语句> <异常处理部分>::=EXCEPTION<异常处理语句>{;<异常处理语句>} 注 计算函数中不⽀持对表进⾏INSERT、DELETE、UPDATE、SELECT、上锁、设置⾃增列属性; 对游标DECLARE、OPEN、FETCH、CLOSE; 事务的COMMIT、ROLLBACK、SAVEPOINT、设置事务的隔离级别和读写属性; 动态SQL的执⾏EXEC、创建INDEX、创建⼦过程。 对于计算函数体内的函数调⽤必须是系统函数或者计算函数。 计算函数可以被指定为表列的缺省值。存储函数与存储过程在结构和功能上⼗分相似,主要的差异在于:存储过程没有返回值,调⽤者只能通过访问OUT或IN OUT参数来获得执⾏结果,⽽存储函数有返回值,它把执⾏结果直接返回给调⽤者;存储过程中可以没有返回语句,⽽存储函数必须通过返回语句结束;不能在存储过程的返回语句中带表达式,⽽存储函数必须带表达式;存储过程不能出现在⼀个表达式中,⽽存储函数可以出现在表达式中。三、客户端DMSQL程序 1.语法 [<声明部分>] BEGIN <执⾏部分> [<异常处理部分>] END 注 客户端DMSQL程序⽆法被其他程序调⽤,但它可以调⽤包括存储过程和存储函数等在内的其他函数。 客户端DMSQL程序不需要存储,创建后⽴即执⾏,执⾏完毕即被释放。四、存储过程和存储函数中参数的使⽤ 1.参数 在存储过程或存储函数中定义⼀个参数时,必须说明名称、参数模式和数据类型。 三种可能的参数模式是:IN(缺省模式)、OUT和IN OUT,意义分别为: IN:输⼊参数,⽤来将数据传送给模块; OUT:输出参数,⽤来从模块返回数据到进⾏调⽤的模块; IN OUT:既作为输⼊参数,也作为输出参数。 注 最多能定义不超过1024个参数; IN参数能被赋值; OUT参数的初值始终为空,⽆论调⽤该模块时对应的实参值为多少; 调⽤⼀个模块时,OUT参数及IN OUT参数的实参必须是可赋值的对象。 2.变量 2.1语法 <变量名>{,<变量名>}[CONSTANT]<变量类型>[NOT NULL][<缺省值定义符><表达式>] <缺省值定义符> ::= DEFAULT | ASSIGN | := 2.2注 声明⼀个变量需要给这个变量指定名字及数据类型。 变量名必须以字母开头,包含数字、字母、下划线以及$、#符号,长度不能超过128字符,并且不能与DM的DMSQL程序保留字相同,变量名与⼤⼩写是⽆关的。 ⽤赋值符号“:=”或关键字DEFAULT、ASSIGN,可以在定义时为变量指定⼀个缺省值。 在DMSQL程序的执⾏部分可以对变量赋值,赋值语句有两种⽅式: 1). 直接赋值语句,语法为: <变量名>:=<表达式> SET <变量名>=<表达式> 2). 通过SQL SELECT INTO 或FETCH INTO给变量赋值,语法: SELECT <表达式>{,<表达式>} [INTO <变量名>{,<变量名>}] FROM <表引⽤>{,<表引⽤>} …; FETCH [NEXT|PREV|FIRST|LAST|ABSOLUTE N|RELATIVE N]<游标名> [INTO<变量名>{,<变量名>}]; 注 常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,它的声明⽅式与变量相似,但必须包含关键字CONSTANT。 变量只在定义它的语句块(包括其下层的语句块)内可见,并且定义在下⼀层语句块中的变量可以屏蔽上⼀层的同名变量。 当遇到⼀个变量名时,系统⾸先在当前语句块内查找变量的定义;如果没有找到,再向包含该语句块的上⼀层语句块中查找,如此直到最外层。五、调⽤权限⼦句 5.1语法: AUTHID CURRENT_USER – sql语句在当前模式下执⾏ AUTHID DEFINER – sql语句在过程或函数所在的模式下执⾏ 5.2使⽤说明: AUTHID CURRENT_USER:采⽤调⽤者权限,即SQL语句在当前模式下执⾏ AUTHID DEFINER:采⽤定义者权限,即SQL语句在过程或函数所在模式下执⾏ 5.3调⽤存储模块 对存储过程的调⽤可通过CALL语句来完成 直接通过名字及相应的参数执⾏ 通过SELECT语句来调⽤ 5.4区别 通过CALL和直接使⽤名字调⽤存储函数时,不会返回函数的返回值,仅执⾏其中的操作; 通过SELECT语句调⽤存储函数时,不仅会执⾏其中的操作,还会返回函数的返回值。SELECT调⽤的存储函数不⽀持含有OUT、IN OUT模式的参数。 5.5重新编译存储模块 5.5.1语法 ALTER PROCEDURE|FUNCTION <存储模块名定义> COMPILE [DEBUG]; <存储模块名定义> ::=[ <模式名>.]<存储模块名> 5.5.2注 语法中的“DEBUG”没有实际作⽤,仅语法⽀持。 5.6删除存储模块 5.6.1语法 DROP PROCEDURE <存储过程名定义>; <存储过程名定义> ::= [<模式名>.]<存储过程名> 或 DROP FUNCTION <存储函数名定义>; < 存储函数名定义> ::= [<模式名>.]<存储函数名> 5.6.2注 当模式名缺省时,默认为删除当前模式下的存储模块,否则,应指明存储模块所属的模式。 除了DBA⽤户外,其他⽤户只能删除⾃⼰创建的存储模块。六、函数 1.分类 1.1内置函数 1.1.1数值函数 函数 GREATEST 功能:求 n1、n2和 n3中最⼤的数。 函数 ROUND 功能:返回四舍五⼊到⼩数点后⾯ m位的 n值。m应为⼀个整数,缺省值为 0,m为负整数则四舍五⼊到⼩数点的左边,m为正整数则四舍五⼊到⼩数点的右边。若 m为⼩数,系统将⾃动将其转换为整数。 1.1.2字符串函数 函数 TO_SINGLE_BYTE 功能:将多字节形式的字符(串)转换为对应的单字节形式 函数 REGEXP_COUNT 功能:根据 pattern 正则表达式,从 str字符串的第 position个字符开始查找符合正则表达式的⼦串的个数,并符合匹配参数 match_param。position 默认值为 1, position为正整数,⼩于 0则报错;如果 position为空,则返回NULL。pattern必须符合正则表达式的规则,否则报错。match_param不合法,则报错。 1.1.3⽇期函数 函数 TO_DATE/TO_TIMESTAMP/TO_TIMESTAMP_TZ 功能:将 CHAR或者 VARCHAR类型的值转换为DATE/TIMESTAMP数据类型。TO_DATE的结果不带毫秒精度,TO_TIMESTAMP的结果带 6位毫秒精度。TO_TIMESTAMP_TZ的结果带上服务器的时区。 函数 CURRENT_DATE 功能:返回当前⽇期值,结果类型为 DATE,等价于 CURDATE()。 1.1.4空值判断函数 函数 COALESCE 功能:返回其参数中第⼀个⾮空的值,如果所有参数均为 NULL,则返回 NULL。如果参数为多媒体数据类型,如 TEXT类型,则系统会将 TEXT类型先转换为 VARCHAR类型或VARBINARY类型,转换的最⼤长度为 8188,超过部分将被截断。 函数 IFNULL 功能:当表达式 n1为⾮ NULL时,返回 n1;若 n1为 NULL,则返回表达式 n2的值。若 n1与 n2为不同数据类型时,DM会进⾏隐式数据类型转换,若数据类型转换出错,则会报错。 1.1.5类型转换函数 1.1.5类型转换函数 函数 CAST 功能:将参数 value转换为 type类型返回。类型之间转换的相容性如下表所⽰:表中,“允许”表⽰这种语法有效且不受限制,“-”表⽰语法⽆效,“受限”表⽰转换还受到具体参数值的影响。 函数 CONVERT 功能:将参数 value 转换为 type 类型返回。其类型转换相容矩阵与函数 CAST()的相同。 1.1.6杂类函数 函数 LENGTHB 功能:返回value的字节数。 函数 FIELD 功能:根据指定元素value在输⼊列表“e1、e2、e3、e4…en”中的位置返回相应的位置序号,不在输⼊列表时则返回0。 2外部函数 2.1C外部函数 使⽤ C、C++语⾔编写,在数据库外编译并保存在.dll、.so共享库⽂件中,被⽤户通过 DMSQL程序调⽤的函数。 当⽤户调⽤ C 外部函数时,服务器操作步骤如下: ⾸先,确定调⽤的(外部函数使⽤的)共享库及函数;然后,通知代理进程⼯作。代理进程装载指定的共享库,并在函数执⾏后将结果返回给服务器。 编写⽅案 DM结构化参数 该⽅案中,⽤户必须使⽤ DM8提供的编写 C外部函数动态库的接⼝,严格按照如下格式书写外部函数的C代码。 de_data 函数名(de_args *args) { C 语⾔函数实现体; } 标量类型参数 该⽅案中,⽤户不必引⽤ DM 提供的外部函数接⼝,可以按照标准的 C 风格编码,使⽤ C 标量类型作为参数类型。使⽤该⽅案编写的 C 函数,只能在使⽤ X86 CPU 的 64 位⾮Windows 系统中,被数据库引⽤作为外部函数。 返回类型函数名(参数列表) { C 语⾔函数实现体; } C 外部函数创建 CREATE OR REPLACE FUNCTION [<模式名>.]<函数名>[(<参数列表>)] RETURN <返回值类型> EXTERNAL ‗<动态库路径>‘ [<引⽤的函数名>] USING < C | CS >;
2.2JAVA外部函数 JAVA 外部函数是使⽤ JAVA 语⾔编写,在数据库外编译⽣成的 jar 包,被⽤户通过DMSQL 程序调⽤的函数。JAVA 外部函数的执⾏都通过代理 dmagent ⼯具进⾏,为了执⾏ JAVA 外部函数,需要先启动 dmagent 服务。 当⽤户调⽤ JAVA 外部函数时,服务器操作步骤如下: ⾸先,确定调⽤(外部函数使⽤的)jar 包及函数; 然后,通知代理进程⼯作。代理进程装载指定的 jar 包,并在函数执⾏后将结果返回给服务器。 ⽣成 jar 包:⽤户必须严格按照 JAVA 语⾔的格式书写代码,完成后⽣成 jar 包。 JAVA 外部函数创建 CREATE OR REPLACE FUNCTION [<模式名>.]<函数名>[(<参数列表>)] RETURN <返回值类型> EXTERNAL ‗‘ [<引⽤的函数名>] USING JAVA;
2023年6月21日发(作者:)
达梦数据库学习之存储过程、存储函数、函数⼀、存储过程 1.概述 存储过程数据库系统中,⼀组为了完成特定功能的SQL 语句集,它存储在数据库中,⼀次编译后永久有效,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。存储过程是数据库中的⼀个重要对象。在数据量特别庞⼤的情况下利⽤存储过程能达到倍速的效率提升 2.语法 CREATE [OR REPLACE ] PROCEDURE<过程声明><模块体> <过程声明> ::= <存储过程名定义> [WITH ENCRYPTION][(<参数名><参数模式><参数类型> [<默认值表达式>] {,<参数名><参数模式><参数类型> [<默认值表达式>] })][<调⽤权限⼦句>] <存储过程名定义> ::=[<模式名>.]<存储过程名> ::= AS | IS <模块体> ::= [<声明部分>] BEGIN <执⾏部分> [<异常处理部分>] END [存储过程名] <声明部分> ::=[DECLARE]<声明定义>{<声明定义>} <声明定义>::=<变量声明>|<异常变量声明>|<游标定义>|<⼦过程定义>|<⼦函数定义>; <执⾏部分>::={;} ::= [<标号说明>]; <标号说明>::=<<<标号名>>> ::=|<控制语句> <异常处理部分>::=EXCEPTION<异常处理语句>{;<异常处理语句>} 注
可执⾏部分是存储过程的核⼼部分,由SQL语句和流控制语句构成。⽀持的SQL语句包括: 数据查询语句(SELECT) 数据操纵语句(INSERT、DELETE、UPDATE) 游标定义及操纵语句(DECLARE CURSOR、OPEN、FETCH、CLOSE) 事务控制语句(COMMIT、ROLLBACK) 动态SQL执⾏语句(EXECUTE IMMEDIATE) SQL语句必须以分号结尾,否则语法分析报错。⼆、存储函数 1.语法 CREATE [OR REPLACE ] FUNCTION <函数声明><模块体> <函数声明> ::= <存储函数名定义> [WITH ENCRYPTION][FOR CALCULATE][(<参数名><参数模式><参数类型> [<默认值表达式>]{,<参数名><参数模式><参数类型> [<默认值表达式>]})]RETURN <返回数据类型> [<调⽤选项⼦句>][PIPELINED] <存储函数名定义> ::=[<模式名>.]<存储函数名> <调⽤选项⼦句> ::= <调⽤选项> {<调⽤选项>} <调⽤选项> ::= <调⽤权限⼦句> | DETERMINISTIC ::= AS | IS <模块体> ::= [<声明部分>] BEGIN <执⾏部分> [<异常处理部分>] END [存储函数名] <声明部分> ::=[DECLARE]<声明定义>{<声明定义>} <声明定义>::=<变量声明>|<异常变量声明>|<游标定义>|<⼦过程定义>|<⼦函数定义>; <执⾏部分>::={;} ::= [<标号说明>]; <标号说明>::=<<<标号名>>> ::=|<控制语句> <异常处理部分>::=EXCEPTION<异常处理语句>{;<异常处理语句>} 注 计算函数中不⽀持对表进⾏INSERT、DELETE、UPDATE、SELECT、上锁、设置⾃增列属性; 对游标DECLARE、OPEN、FETCH、CLOSE; 事务的COMMIT、ROLLBACK、SAVEPOINT、设置事务的隔离级别和读写属性; 动态SQL的执⾏EXEC、创建INDEX、创建⼦过程。 对于计算函数体内的函数调⽤必须是系统函数或者计算函数。 计算函数可以被指定为表列的缺省值。存储函数与存储过程在结构和功能上⼗分相似,主要的差异在于:存储过程没有返回值,调⽤者只能通过访问OUT或IN OUT参数来获得执⾏结果,⽽存储函数有返回值,它把执⾏结果直接返回给调⽤者;存储过程中可以没有返回语句,⽽存储函数必须通过返回语句结束;不能在存储过程的返回语句中带表达式,⽽存储函数必须带表达式;存储过程不能出现在⼀个表达式中,⽽存储函数可以出现在表达式中。三、客户端DMSQL程序 1.语法 [<声明部分>] BEGIN <执⾏部分> [<异常处理部分>] END 注 客户端DMSQL程序⽆法被其他程序调⽤,但它可以调⽤包括存储过程和存储函数等在内的其他函数。 客户端DMSQL程序不需要存储,创建后⽴即执⾏,执⾏完毕即被释放。四、存储过程和存储函数中参数的使⽤ 1.参数 在存储过程或存储函数中定义⼀个参数时,必须说明名称、参数模式和数据类型。 三种可能的参数模式是:IN(缺省模式)、OUT和IN OUT,意义分别为: IN:输⼊参数,⽤来将数据传送给模块; OUT:输出参数,⽤来从模块返回数据到进⾏调⽤的模块; IN OUT:既作为输⼊参数,也作为输出参数。 注 最多能定义不超过1024个参数; IN参数能被赋值; OUT参数的初值始终为空,⽆论调⽤该模块时对应的实参值为多少; 调⽤⼀个模块时,OUT参数及IN OUT参数的实参必须是可赋值的对象。 2.变量 2.1语法 <变量名>{,<变量名>}[CONSTANT]<变量类型>[NOT NULL][<缺省值定义符><表达式>] <缺省值定义符> ::= DEFAULT | ASSIGN | := 2.2注 声明⼀个变量需要给这个变量指定名字及数据类型。 变量名必须以字母开头,包含数字、字母、下划线以及$、#符号,长度不能超过128字符,并且不能与DM的DMSQL程序保留字相同,变量名与⼤⼩写是⽆关的。 ⽤赋值符号“:=”或关键字DEFAULT、ASSIGN,可以在定义时为变量指定⼀个缺省值。 在DMSQL程序的执⾏部分可以对变量赋值,赋值语句有两种⽅式: 1). 直接赋值语句,语法为: <变量名>:=<表达式> SET <变量名>=<表达式> 2). 通过SQL SELECT INTO 或FETCH INTO给变量赋值,语法: SELECT <表达式>{,<表达式>} [INTO <变量名>{,<变量名>}] FROM <表引⽤>{,<表引⽤>} …; FETCH [NEXT|PREV|FIRST|LAST|ABSOLUTE N|RELATIVE N]<游标名> [INTO<变量名>{,<变量名>}]; 注 常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,它的声明⽅式与变量相似,但必须包含关键字CONSTANT。 变量只在定义它的语句块(包括其下层的语句块)内可见,并且定义在下⼀层语句块中的变量可以屏蔽上⼀层的同名变量。 当遇到⼀个变量名时,系统⾸先在当前语句块内查找变量的定义;如果没有找到,再向包含该语句块的上⼀层语句块中查找,如此直到最外层。五、调⽤权限⼦句 5.1语法: AUTHID CURRENT_USER – sql语句在当前模式下执⾏ AUTHID DEFINER – sql语句在过程或函数所在的模式下执⾏ 5.2使⽤说明: AUTHID CURRENT_USER:采⽤调⽤者权限,即SQL语句在当前模式下执⾏ AUTHID DEFINER:采⽤定义者权限,即SQL语句在过程或函数所在模式下执⾏ 5.3调⽤存储模块 对存储过程的调⽤可通过CALL语句来完成 直接通过名字及相应的参数执⾏ 通过SELECT语句来调⽤ 5.4区别 通过CALL和直接使⽤名字调⽤存储函数时,不会返回函数的返回值,仅执⾏其中的操作; 通过SELECT语句调⽤存储函数时,不仅会执⾏其中的操作,还会返回函数的返回值。SELECT调⽤的存储函数不⽀持含有OUT、IN OUT模式的参数。 5.5重新编译存储模块 5.5.1语法 ALTER PROCEDURE|FUNCTION <存储模块名定义> COMPILE [DEBUG]; <存储模块名定义> ::=[ <模式名>.]<存储模块名> 5.5.2注 语法中的“DEBUG”没有实际作⽤,仅语法⽀持。 5.6删除存储模块 5.6.1语法 DROP PROCEDURE <存储过程名定义>; <存储过程名定义> ::= [<模式名>.]<存储过程名> 或 DROP FUNCTION <存储函数名定义>; < 存储函数名定义> ::= [<模式名>.]<存储函数名> 5.6.2注 当模式名缺省时,默认为删除当前模式下的存储模块,否则,应指明存储模块所属的模式。 除了DBA⽤户外,其他⽤户只能删除⾃⼰创建的存储模块。六、函数 1.分类 1.1内置函数 1.1.1数值函数 函数 GREATEST 功能:求 n1、n2和 n3中最⼤的数。 函数 ROUND 功能:返回四舍五⼊到⼩数点后⾯ m位的 n值。m应为⼀个整数,缺省值为 0,m为负整数则四舍五⼊到⼩数点的左边,m为正整数则四舍五⼊到⼩数点的右边。若 m为⼩数,系统将⾃动将其转换为整数。 1.1.2字符串函数 函数 TO_SINGLE_BYTE 功能:将多字节形式的字符(串)转换为对应的单字节形式 函数 REGEXP_COUNT 功能:根据 pattern 正则表达式,从 str字符串的第 position个字符开始查找符合正则表达式的⼦串的个数,并符合匹配参数 match_param。position 默认值为 1, position为正整数,⼩于 0则报错;如果 position为空,则返回NULL。pattern必须符合正则表达式的规则,否则报错。match_param不合法,则报错。 1.1.3⽇期函数 函数 TO_DATE/TO_TIMESTAMP/TO_TIMESTAMP_TZ 功能:将 CHAR或者 VARCHAR类型的值转换为DATE/TIMESTAMP数据类型。TO_DATE的结果不带毫秒精度,TO_TIMESTAMP的结果带 6位毫秒精度。TO_TIMESTAMP_TZ的结果带上服务器的时区。 函数 CURRENT_DATE 功能:返回当前⽇期值,结果类型为 DATE,等价于 CURDATE()。 1.1.4空值判断函数 函数 COALESCE 功能:返回其参数中第⼀个⾮空的值,如果所有参数均为 NULL,则返回 NULL。如果参数为多媒体数据类型,如 TEXT类型,则系统会将 TEXT类型先转换为 VARCHAR类型或VARBINARY类型,转换的最⼤长度为 8188,超过部分将被截断。 函数 IFNULL 功能:当表达式 n1为⾮ NULL时,返回 n1;若 n1为 NULL,则返回表达式 n2的值。若 n1与 n2为不同数据类型时,DM会进⾏隐式数据类型转换,若数据类型转换出错,则会报错。 1.1.5类型转换函数 1.1.5类型转换函数 函数 CAST 功能:将参数 value转换为 type类型返回。类型之间转换的相容性如下表所⽰:表中,“允许”表⽰这种语法有效且不受限制,“-”表⽰语法⽆效,“受限”表⽰转换还受到具体参数值的影响。 函数 CONVERT 功能:将参数 value 转换为 type 类型返回。其类型转换相容矩阵与函数 CAST()的相同。 1.1.6杂类函数 函数 LENGTHB 功能:返回value的字节数。 函数 FIELD 功能:根据指定元素value在输⼊列表“e1、e2、e3、e4…en”中的位置返回相应的位置序号,不在输⼊列表时则返回0。 2外部函数 2.1C外部函数 使⽤ C、C++语⾔编写,在数据库外编译并保存在.dll、.so共享库⽂件中,被⽤户通过 DMSQL程序调⽤的函数。 当⽤户调⽤ C 外部函数时,服务器操作步骤如下: ⾸先,确定调⽤的(外部函数使⽤的)共享库及函数;然后,通知代理进程⼯作。代理进程装载指定的共享库,并在函数执⾏后将结果返回给服务器。 编写⽅案 DM结构化参数 该⽅案中,⽤户必须使⽤ DM8提供的编写 C外部函数动态库的接⼝,严格按照如下格式书写外部函数的C代码。 de_data 函数名(de_args *args) { C 语⾔函数实现体; } 标量类型参数 该⽅案中,⽤户不必引⽤ DM 提供的外部函数接⼝,可以按照标准的 C 风格编码,使⽤ C 标量类型作为参数类型。使⽤该⽅案编写的 C 函数,只能在使⽤ X86 CPU 的 64 位⾮Windows 系统中,被数据库引⽤作为外部函数。 返回类型函数名(参数列表) { C 语⾔函数实现体; } C 外部函数创建 CREATE OR REPLACE FUNCTION [<模式名>.]<函数名>[(<参数列表>)] RETURN <返回值类型> EXTERNAL ‗<动态库路径>‘ [<引⽤的函数名>] USING < C | CS >;
2.2JAVA外部函数 JAVA 外部函数是使⽤ JAVA 语⾔编写,在数据库外编译⽣成的 jar 包,被⽤户通过DMSQL 程序调⽤的函数。JAVA 外部函数的执⾏都通过代理 dmagent ⼯具进⾏,为了执⾏ JAVA 外部函数,需要先启动 dmagent 服务。 当⽤户调⽤ JAVA 外部函数时,服务器操作步骤如下: ⾸先,确定调⽤(外部函数使⽤的)jar 包及函数; 然后,通知代理进程⼯作。代理进程装载指定的 jar 包,并在函数执⾏后将结果返回给服务器。 ⽣成 jar 包:⽤户必须严格按照 JAVA 语⾔的格式书写代码,完成后⽣成 jar 包。 JAVA 外部函数创建 CREATE OR REPLACE FUNCTION [<模式名>.]<函数名>[(<参数列表>)] RETURN <返回值类型> EXTERNAL ‗‘ [<引⽤的函数名>] USING JAVA;
发布评论