我们正在运行一个系统,为越南的小户主提供可追溯服务。系统运行在Oracle 12i DB上,它有一个存储过程来生成随机代码,为系统腾出二维码空间,如下所示:
PROCEDURE GENCODE
(
PI_NUM_CODE IN NUMBER
) AS
ind number;
code_gen varchar2(10);
BEGIN
for ind in 1..PI_NUM_CODE loop
begin
code_gen := dbms_random.string('X', 10);
insert into tb_code_gen(s_code) values(code_gen);
exception when others then
dbms_output.put_line(code_gen);
end;
end loop;
END GENCODE;
您能帮我解释一下
IN NUMBER
声明吗,谢谢。我正在尝试帮助合作伙伴修复此代码以使系统运行。
请您解释一下并帮助我理解该声明,谢谢。
您能帮我解释一下
声明吗IN NUMBER
这位于 Oracle
CREATE PROCEDURE
文档:
PROCEDURE GENCODE
(
PI_NUM_CODE IN NUMBER
) AS
PROCEDURE
表示您正在定义一个过程(可能是 PACKAGE
的一部分,因为您没有事先包含用于创建独立过程的 CREATE
关键字)。GENCODE
是过程的标识符(名称)。(
开始参数声明。PI_NUM_CODE
是过程的第一个参数(或参数)的标识符(名称)。IN
表示该参数将用于将数据输入到过程中。NUMBER
是参数的数据类型。)
结束参数声明。AS
结束程序的签名并开始程序的主体。PI_NUM_CODE IN NUMBER ----> 是过程 GENCODE 的输入参数。 在调用该过程时,您需要传递它。
例如
开始 GENCODE(5);--这里我们传递了 5 作为参数值。因此您的 如程序逻辑中所述,循环将执行 5 次。 结束;
pi_num_code
是执行过程时想要生成的行数(QR码,正如你所说)。这就是 - 在程序中 - FOR
循环运行的次数。
这是一个例子。
目标表:
SQL> CREATE TABLE tb_code_gen
2 (
3 s_code VARCHAR2 (20)
4 );
Table created.
程序:
SQL> CREATE OR REPLACE PROCEDURE gencode (pi_num_code IN NUMBER)
2 AS
3 ind NUMBER;
4 code_gen VARCHAR2 (10);
5 BEGIN
6 FOR ind IN 1 .. pi_num_code --> "run code within the loop PI_NUM_CODE number of times"
7 LOOP
8 BEGIN
9 code_gen := DBMS_RANDOM.string ('X', 10);
10
11 INSERT INTO tb_code_gen (s_code)
12 VALUES (code_gen);
13 EXCEPTION
14 WHEN OTHERS
15 THEN
16 DBMS_OUTPUT.put_line (code_gen);
17 END;
18 END LOOP;
19 END gencode;
20 /
Procedure created.
启用输出(否则你不会看到异常处理部分中是否显示有
dbms_output.put_line
):
SQL> SET SERVEROUTPUT ON
让我们生成 3 个代码:
SQL> BEGIN
2 gencode (pi_num_code => 3);
3 END;
4 /
PL/SQL procedure successfully completed.
他们在这里:
SQL> SELECT * FROM tb_code_gen;
S_CODE
--------------------
G31O4H7M90
SXTESE3HYJ
PPCL6PAU17
SQL>
另一方面,您不需要循环(也不需要过程) - insert 可以做到这一点:
SQL> INSERT INTO tb_code_gen (s_code)
2 SELECT DBMS_RANDOM.string ('X', 10)
3 FROM DUAL
4 CONNECT BY LEVEL <= 3; --> this "3" is value you passed to procedure
3 rows created. --> another 3 rows created
SQL> SELECT * FROM tb_code_gen;
S_CODE
--------------------
G31O4H7M90
SXTESE3HYJ
PPCL6PAU17
GDEU7I42PZ
JGLGY11URW
EN2T4NTCI6
6 rows selected.
SQL>