Car*_*res 5 sql oracle stored-procedures oracle11g oracle-sqldeveloper
我正在创建一些过程和函数,以简化插入,删除或更新行的任务。我的问题听起来很傻,因为确定我缺少某些东西。
每当我尝试将十进制值作为参数传递给过程或函数时,都会收到错误消息。
ORA-06502:PL / SQL:数字或值错误:字符到数字的转换错误
下一个代码不起作用,而是一种显示问题的方法。
CREATE OR REPLACE FUNCTION test1(num1 NUMBER)
RETURN NUMBER IS
BEGIN
RETURN num1;
END;
/
SET SERVEROUTPUT ON;
DECLARE
numVar NUMBER;
BEGIN
numVar:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar);
/***********Calling test1*************/
DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(2.1));
END;
/
Run Code Online (Sandbox Code Playgroud)
一些输出是西班牙语,但大多数是英语。
Function TEST1 compilado
Raw Number: 2,1
Error que empieza en la línea: 8 del comando :
DECLARE
numVar NUMBER;
BEGIN
numVar:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar);
DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(2.1));
END;
Informe de error -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 6
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.
Run Code Online (Sandbox Code Playgroud)
当我调用没有十进制参数的函数时,我不会遇到麻烦。
/***********Calling test1*************/
DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(2));
Run Code Online (Sandbox Code Playgroud)
输出量
Function TEST1 compilado
Raw Number: 2,1
Function Number: 2
Run Code Online (Sandbox Code Playgroud)
如果我传递变量而不是原始的十进制数,那么我也没有任何麻烦,实际上我可以使用十进制数,但是对于我来说,创建一个过程来插入数据需要定义一个变量以将其作为一个参数
/***********Calling test1*************/
DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(numVar));
Run Code Online (Sandbox Code Playgroud)
输出量
Function TEST1 compilado
Raw Number: 2,1
Function Number: 2,1
Run Code Online (Sandbox Code Playgroud)
我想了解为什么不能将原始十进制数作为参数传递,也许我不太了解Oracle在将其作为参数引入之前如何转换数据。
此问题似乎是 Oracle SQL Developer 特有的。
我有Oracle 11.2.0.3.0 64bit,当我在TOAD 12.0.0.61中测试它时,一切正常,但在Oracle SQL Developer 17.2.0.188中则不然。
我是如何测试的:
首先,创建过程:
CREATE OR REPLACE FUNCTION test_function(x$n in NUMBER)
RETURN NUMBER IS
BEGIN
RETURN x$n;
END;
Run Code Online (Sandbox Code Playgroud)
测试#1,使用.:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
DECLARE
numVar$n NUMBER;
BEGIN
numVar$n:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(2.1));
END;
Run Code Online (Sandbox Code Playgroud)
输出:
Raw Number: 2.1
Function Number: 2.1
Run Code Online (Sandbox Code Playgroud)
测试#2,使用,:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';
DECLARE
numVar$n NUMBER;
BEGIN
numVar$n:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(2.1));
END;
Run Code Online (Sandbox Code Playgroud)
输出:
Raw Number: 2,1
Function Number: 2,1
Run Code Online (Sandbox Code Playgroud)
在Oracle SQL Developer中,测试 #1 工作正常,但测试 #2 引发ORA-06502 - 这就是您的情况。
解决方案#1:使用to_number('2,1')而不是2.1:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';
DECLARE
numVar$n NUMBER;
BEGIN
numVar$n:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(to_number('2,1')));
END;
Run Code Online (Sandbox Code Playgroud)
输出:
Raw Number: 2,1
Function Number: 2,1
Run Code Online (Sandbox Code Playgroud)
解决方案#2NLS_NUMERIC_CHARACTERS :在执行期间更改:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';
DECLARE
numVar$n NUMBER;
nnc$c VARCHAR2(255);
BEGIN
numVar$n:= 2.1;
SELECT value
INTO nnc$c
FROM nls_session_parameters
WHERE parameter = 'NLS_NUMERIC_CHARACTERS';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''';
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(2.1));
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS='''||nnc$c||'''';
END;
Run Code Online (Sandbox Code Playgroud)
输出:
Raw Number: 2.1
Function Number: 2.1
Run Code Online (Sandbox Code Playgroud)