在DB2过程中如何在动态查询中调用不带模式名的用户定义函数

在DB2过程中如何在动态查询中调用不带模式名的用户定义函数,db2,Db2,如果没有架构名称,则无法调用用户定义的函数 CREATE PROCEDURE TEST_PROC ( IN IN_EMP_ID INT ) LANGUAGE SQL DYNAMIC RESULT SETS 1 ISOLATION LEVEL CS DISABLE DEBUG MODE VALIDATE BIND DYNAMICRULES BIND QUALIFIER ABC BEGIN DECLARE STMT VARCHAR(500) ; DECLARE emp_cur

如果没有架构名称,则无法调用用户定义的函数

CREATE PROCEDURE TEST_PROC (
    IN IN_EMP_ID INT
)
LANGUAGE SQL
DYNAMIC RESULT SETS 1
ISOLATION LEVEL CS
DISABLE DEBUG MODE
VALIDATE BIND
DYNAMICRULES BIND
QUALIFIER ABC
BEGIN
DECLARE STMT VARCHAR(500) ;
        DECLARE emp_curr CURSOR WITH RETURN FOR TRANSACTIONS;
        SET STMT = '';

        SET STMT = STMT ||'SELECT ' ||
                                      'EMP_ID, ' ||
                                      'ABC.TEST_FUNCTION(EMP_ID), ' ||
                                      'EMP_NAME, ' ||
                                      'SALARY, ' ||
                                      'COMPANY ' ||
                                    'FROM ' ||
                                      'EMP_DETAILS ' ||
                                    'WHERE 1=1 ';
            IF IN_EMP_ID IS NOT NULL THEN
                SET STMT = STMT || ' AND EMP_ID =' || IN_EMP_ID ;
            END IF ;

            PREPARE TRANSACTIONS FROM STMT ;
        OPEN emp_curr;
END;
当我尝试执行此过程时,它会工作,但如果我从突出显示的函数中删除别名,则它无法调用用户定义函数。请先帮我解决,谢谢。

您可以使用SET PATH语句来帮助解决不合格的函数名和数据类型名,这在所有平台上都适用,但在规则和语法上有所不同。因此,请从下面的链接中选择您的Db2服务器平台

其思想是告诉Db2如何搜索非限定函数名。请注意,这与非限定表/视图等不同

对于DB2forz/OS,请参见此处

对于DB2fori系列,请参见以下内容


对于Db2 For Linux/Unix/Windows,有关更改特殊寄存器当前路径的详细信息,请参阅。

动态SQL中程序对象(如函数)的名称解析由以下控制:

CURRENT PATH或CURRENT_PATH特殊寄存器指定一个VARCHAR2048值,该值标识在解析动态准备的SQL语句中的非限定函数名、过程名、数据类型名、全局变量名和模块对象名时使用的SQL路径

在例程内设置动态语句的路径效果示例:

--#SET TERMINATOR @

CREATE OR REPLACE FUNCTION S1.TEST_SCALAR() RETURNS INT RETURN 1@

CREATE OR REPLACE FUNCTION S2.TEST_SCALAR() RETURNS INT RETURN 2@

CREATE OR REPLACE PROCEDURE TEST_DYN()
DYNAMIC RESULT SETS 1
BEGIN
  DECLARE C1 CURSOR WITH RETURN FOR S1;

  PREPARE S1 FROM 'SELECT TEST_SCALAR() AS RES FROM (VALUES 1) T(I)';
  OPEN C1;
END@

SET PATH = "S1", USER, SYSTEM PATH@
CALL TEST_DYN@

SET PATH = "S2", USER, SYSTEM PATH@
CALL TEST_DYN@
结果是:

SET PATH = "S1", USER, SYSTEM PATH
DB20000I  The SQL command completed successfully.

CALL TEST_DYN


  Result set 1
  --------------

  RES
  -----------
            1

  1 record(s) selected.

  Return Status = 0

SET PATH = "S2", USER, SYSTEM PATH
DB20000I  The SQL command completed successfully.

CALL TEST_DYN


  Result set 1
  --------------

  RES
  -----------
            2

  1 record(s) selected.

  Return Status = 0

为什么,背景是什么?您需要限定function 2部件标识符,或者以某种方式将当前模式设置为ContextThank for Quick answer,我已经在过程本身中将模式名称应用为限定符ABC。在这个过程之前,我正在为当前模式设置这个代码,设置current schema='ABC';感谢您的回答,在创建过程时是否需要设置路径?实际上,我是从Java调用这个过程的。当前我在创建过程之前使用下面的语句设置当前sqlid='USER'?设置当前模式='EHT'?是否有任何方法可以直接给出过程内部的路径?