oracle utl_lms 用变量替换整数
oracle utl_lms integer substitution with variables
我在使用 oracle 的 UTL_LMS.MESSAGE_FORMAT 时遇到了一个奇怪的问题。当以变量替换为目标 %d 替换时,UTL_LMS 悄悄地无法替换并中断我的调用堆栈中的异常消息传递。
UTL_LMS.FORMAT_MESSAGE 调用 VARCHAR 参数,但 doc(11gR2) 示例中的类型转换似乎与整数变量兼容。但是,我的 %d 永远不会被替换。
我希望有一些 ideas/advice。失败示例如下。
运行 以下:
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,C_MULTIPLIER)
);
END;
/
产量:
My integer is: 19
The hobbit likes to breakdance with the wookie times a day.
然而,下面转换原始 int 很好:
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,19)
);
END;
/
My integer is: 19
The hobbit likes to breakdance with the wookie 19 times a day.
以下解决方法不可取。
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,TO_CHAR(C_MULTIPLIER))
);
END;
/
My integer is: 19
The hobbit likes to breakdance with the wookie 19 times a day.
- 为什么 FORMAT_MESSAGE 接受原始整数,但在 INTEGER 类型(或一般 NUMBER 类型)变量上失败?
- 是否有更好的预打包 (11g) dbms 消息格式化程序可用?
- 关于 oracle 11g 中的干净消息格式的任何其他建议?我会考虑包装 java 的 MessageFormat/String#format(),或者创建一个 FORMAT_MESSAGE 委托来处理 char 类型转换,但我更愿意为所有数据库避免这种情况需要它,我不太热衷于 "just remembering" to_char() 无处不在,因为失败是相当安静的。
谢谢!
查看文档
https://docs.oracle.com/database/121/ARPLS/u_lms.htm#ARPLS71196
该示例指定了 PLS_INTEGER 而不是整数或数字。我已经对此进行了测试,并使用 PLS_INTEGER 在 Integer 不工作的地方工作。
我知道这不是一个理想的解决方案,我不确定将您的变量定义为 pls_integer 是否适合您。但可能会有一些帮助。
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT PLS_INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,C_MULTIPLIER)
);
END;
给出输出
My integer is: 19
The hobbit likes to breakdance with the wookie 19 times a day.
我在使用 oracle 的 UTL_LMS.MESSAGE_FORMAT 时遇到了一个奇怪的问题。当以变量替换为目标 %d 替换时,UTL_LMS 悄悄地无法替换并中断我的调用堆栈中的异常消息传递。
UTL_LMS.FORMAT_MESSAGE 调用 VARCHAR 参数,但 doc(11gR2) 示例中的类型转换似乎与整数变量兼容。但是,我的 %d 永远不会被替换。
我希望有一些 ideas/advice。失败示例如下。
运行 以下:
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,C_MULTIPLIER)
);
END;
/
产量:
My integer is: 19
The hobbit likes to breakdance with the wookie times a day.
然而,下面转换原始 int 很好:
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,19)
);
END;
/
My integer is: 19
The hobbit likes to breakdance with the wookie 19 times a day.
以下解决方法不可取。
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,TO_CHAR(C_MULTIPLIER))
);
END;
/
My integer is: 19
The hobbit likes to breakdance with the wookie 19 times a day.
- 为什么 FORMAT_MESSAGE 接受原始整数,但在 INTEGER 类型(或一般 NUMBER 类型)变量上失败?
- 是否有更好的预打包 (11g) dbms 消息格式化程序可用?
- 关于 oracle 11g 中的干净消息格式的任何其他建议?我会考虑包装 java 的 MessageFormat/String#format(),或者创建一个 FORMAT_MESSAGE 委托来处理 char 类型转换,但我更愿意为所有数据库避免这种情况需要它,我不太热衷于 "just remembering" to_char() 无处不在,因为失败是相当安静的。
谢谢!
查看文档
https://docs.oracle.com/database/121/ARPLS/u_lms.htm#ARPLS71196
该示例指定了 PLS_INTEGER 而不是整数或数字。我已经对此进行了测试,并使用 PLS_INTEGER 在 Integer 不工作的地方工作。
我知道这不是一个理想的解决方案,我不确定将您的变量定义为 pls_integer 是否适合您。但可能会有一些帮助。
DECLARE
C_INTRANSITIVE_VERB CONSTANT VARCHAR2(50) := 'breakdance';
C_SUBJECT_NOUN CONSTANT VARCHAR2(50) := 'hobbit';
C_PREPOSITION_OBJECT CONSTANT VARCHAR2(50) := 'wookie';
C_MULTIPLIER CONSTANT PLS_INTEGER := 19;
C_TEMPLATE CONSTANT VARCHAR2(400) := 'The %s likes to %s with the %s %d times a day.';
BEGIN
DBMS_OUTPUT.PUT_LINE('My integer is: '|| C_MULTIPLIER);
DBMS_OUTPUT.PUT_LINE(
UTL_LMS.FORMAT_MESSAGE(C_TEMPLATE,C_SUBJECT_NOUN,C_INTRANSITIVE_VERB,C_PREPOSITION_OBJECT,C_MULTIPLIER)
);
END;
给出输出
My integer is: 19
The hobbit likes to breakdance with the wookie 19 times a day.