在 PL/SQL 脚本中获取字符串缓冲区太小错误?
Getting character string buffer too small error in PL/SQL script?
我是 PL/SQL 的新手。
我正在编写一个小脚本来帮助我将集合加入数据库 table。这个集合将包含数千个 ID,但在这里,为了简单起见,我将它保持得非常小。
VARIABLE cursor REFCURSOR;
DECLARE
your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
your_collection.EXTEND(2);
FOR i IN 1 .. 2 LOOP
your_collection(i) := DBMS_RANDOM.STRING( '7839', '7689' );
END LOOP;
OPEN :cursor FOR
SELECT t.*
FROM emp t
INNER JOIN
TABLE( your_collection ) c
ON t.empno = c.COLUMN_VALUE;
END;
/
PRINT cursor;
这是我遇到的错误。
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_RANDOM", line 144
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.
CURSOR
如果还有其他错误,请帮助我更正我的脚本。我将不胜感激。
DBMS_RANDOM.STRING()
接受两个参数:
- 第一个是单个字符,指定随机生成的字符类型;和
- 第二个是长度
当您向第一个参数提供 4 个字符的长度值时产生错误,而它只接受 1 个字符的长度值。
您可能打算做的是:
VARIABLE cursor REFCURSOR;
DECLARE
your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
your_collection.EXTEND(2); -- Set the length of the array
your_collection(1) := '7839'; -- Specify the first value in the array.
your_collection(2) := '7689'; -- Specify the second value in the array.
OPEN :cursor FOR
SELECT t.*
FROM emp t
INNER JOIN
TABLE( your_collection ) c
ON t.empno = c.COLUMN_VALUE;
END;
/
PRINT cursor;
或更简单(并转换为数字,因为值看起来是数字):
...
DECLARE
your_collection SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST( 7839, 7689 );
BEGIN
OPEN :cursor FOR
...
我是 PL/SQL 的新手。
我正在编写一个小脚本来帮助我将集合加入数据库 table。这个集合将包含数千个 ID,但在这里,为了简单起见,我将它保持得非常小。
VARIABLE cursor REFCURSOR;
DECLARE
your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
your_collection.EXTEND(2);
FOR i IN 1 .. 2 LOOP
your_collection(i) := DBMS_RANDOM.STRING( '7839', '7689' );
END LOOP;
OPEN :cursor FOR
SELECT t.*
FROM emp t
INNER JOIN
TABLE( your_collection ) c
ON t.empno = c.COLUMN_VALUE;
END;
/
PRINT cursor;
这是我遇到的错误。
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_RANDOM", line 144
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.
CURSOR
如果还有其他错误,请帮助我更正我的脚本。我将不胜感激。
DBMS_RANDOM.STRING()
接受两个参数:
- 第一个是单个字符,指定随机生成的字符类型;和
- 第二个是长度
当您向第一个参数提供 4 个字符的长度值时产生错误,而它只接受 1 个字符的长度值。
您可能打算做的是:
VARIABLE cursor REFCURSOR;
DECLARE
your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
your_collection.EXTEND(2); -- Set the length of the array
your_collection(1) := '7839'; -- Specify the first value in the array.
your_collection(2) := '7689'; -- Specify the second value in the array.
OPEN :cursor FOR
SELECT t.*
FROM emp t
INNER JOIN
TABLE( your_collection ) c
ON t.empno = c.COLUMN_VALUE;
END;
/
PRINT cursor;
或更简单(并转换为数字,因为值看起来是数字):
...
DECLARE
your_collection SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST( 7839, 7689 );
BEGIN
OPEN :cursor FOR
...