Oracle存储过程生成随机代码

问题描述 投票:0回答:3

我们正在运行一个系统,为越南的小户主提供可追溯服务。系统运行在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
声明吗,谢谢。我正在尝试帮助合作伙伴修复此代码以使系统运行。

请您解释一下并帮助我理解该声明,谢谢。

oracle stored-procedures
3个回答
0
投票

您能帮我解释一下

IN NUMBER
声明吗

这位于 Oracle

CREATE PROCEDURE
文档

PROCEDURE GENCODE 
(
  PI_NUM_CODE IN NUMBER 
) AS
  • PROCEDURE
    表示您正在定义一个过程(可能是
    PACKAGE
    的一部分,因为您没有事先包含用于创建独立过程的
    CREATE
    关键字)。
  • GENCODE
    是过程的标识符(名称)。
  • (
    开始参数声明。
  • PI_NUM_CODE
    是过程的第一个参数(或参数)的标识符(名称)。
  • IN
    表示该参数将用于将数据输入到过程中。
  • NUMBER
    是参数的数据类型。
  • )
    结束参数声明。
  • AS
    结束程序的签名并开始程序的主体。

0
投票

PI_NUM_CODE IN NUMBER ----> 是过程 GENCODE 的输入参数。 在调用该过程时,您需要传递它。

例如

开始 GENCODE(5);--这里我们传递了 5 作为参数值。因此您的 如程序逻辑中所述,循环将执行 5 次。 结束;


0
投票

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>
© www.soinside.com 2019 - 2024. All rights reserved.