存储过程中的选择计数(*),并在if语句中使用计数

发布于 2025-01-23 07:04:35 字数 637 浏览 4 评论 0原文

我正在Oracle数据库中创建一个存储过程,该过程导致错误” ORA-01858:在预期数字的情况下找到了一个非数字字符”。

我的过程如下:

create or replace procedure testProc(
id IN VARCHAR2,
user IN VARCHAR2,
sender IN VARCHAR2
)
as 

vCount number;
begin
     select count(*) into vCount from table1 where id='12345'
     
     if vCount=0
         insert into table1 (id, user, sender, status) values (id, user, partner, status);
     else
         update table1 set status='ERR' where id='12345'
     end if;
end procedure;

错误:ORA-01858:发现了一个非数字字符,而我尝试替换数字

我尝试替换vcount作为int无济于事。还尝试在Varchar2中的发件人下方声明VCOUNT。

有人可以告诉什么是正确使用上述过程的正确方法。

I am creating a stored procedure in Oracle database that's resulting in error "ORA-01858: a non-numeric character was found where a numeric was expected".

My procedure is as below:

create or replace procedure testProc(
id IN VARCHAR2,
user IN VARCHAR2,
sender IN VARCHAR2
)
as 

vCount number;
begin
     select count(*) into vCount from table1 where id='12345'
     
     if vCount=0
         insert into table1 (id, user, sender, status) values (id, user, partner, status);
     else
         update table1 set status='ERR' where id='12345'
     end if;
end procedure;

Error: ORA-01858: a non-numeric character was found where a numeric was expected

I tried replacing vCount as int that did not help. Also tried declaring vCount below sender IN VARCHAR2.

Can someone please tell what is correct way to use the above procedure.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱你不解释 2025-01-30 07:04:35

使用Merge语句,然后您可以在单个语句中执行(而不是选择,然后是insertupdate>更新 >):

CREATE PROCEDURE testProc(
  i_id     IN table1.id%TYPE,
  i_user   IN table1."USER"%TYPE,
  i_sender IN table1.sender%TYPE,
  i_status IN table1.status%TYPE
)
AS
BEGIN
  MERGE INTO table1 dst
  USING (
    SELECT '12345' AS id
    FROM   DUAL
  ) src
  ON (src.id = dst.id)
  WHEN MATCHED THEN
    UPDATE SET status = 'Err'
  WHEN NOT MATCHED THEN
    INSERT (id, "USER", sender, status)
    VALUES (i_id, i_user, i_sender, i_status);
END testProc;
/

db<> fiddle

Use a MERGE statement then you can do it in a single statement (rather than SELECT followed by either INSERT or UPDATE):

CREATE PROCEDURE testProc(
  i_id     IN table1.id%TYPE,
  i_user   IN table1."USER"%TYPE,
  i_sender IN table1.sender%TYPE,
  i_status IN table1.status%TYPE
)
AS
BEGIN
  MERGE INTO table1 dst
  USING (
    SELECT '12345' AS id
    FROM   DUAL
  ) src
  ON (src.id = dst.id)
  WHEN MATCHED THEN
    UPDATE SET status = 'Err'
  WHEN NOT MATCHED THEN
    INSERT (id, "USER", sender, status)
    VALUES (i_id, i_user, i_sender, i_status);
END testProc;
/

db<>fiddle here

海螺姑娘 2025-01-30 07:04:35

此代码无法返回您指定的错误,因为

  1. 过程是无效(MISING语句终止器;列名不能为用户,因为它是关键字,保留用于当前记录用户)
  2. 该错误代码与 date 问题有关,而 - 在您的代码中 - 没有什么像日期那样,

因此,不可能帮助您解决您所说的错误。否则,请考虑不要命名过程的参数与列名相同,因为这会导致各种问题。

像这样的东西会起作用,但与您遇到的错误无关。

示例表:

SQL> CREATE TABLE table1
  2  (
  3     id        VARCHAR2 (5),
  4     c_user    VARCHAR2 (20),
  5     partner   VARCHAR2 (10),
  6     sender    VARCHAR2 (10),
  7     status    VARCHAR2 (5)
  8  );

Table created.

SQL>

过程:

SQL> CREATE OR REPLACE PROCEDURE testProc (p_id      IN VARCHAR2,
  2                                        p_user    IN VARCHAR2,
  3                                        p_sender  IN VARCHAR2)
  4  AS
  5     vCount  NUMBER;
  6  BEGIN
  7     SELECT COUNT (*)
  8       INTO vCount
  9       FROM table1
 10      WHERE id = p_id;
 11
 12     IF vCount = 0
 13     THEN
 14        INSERT INTO table1 (id,
 15                            c_user,
 16                            sender,
 17                            status)
 18             VALUES (p_id,
 19                     p_user,
 20                     NULL,
 21                     'NEW');
 22     ELSE
 23        UPDATE table1
 24           SET status = 'ERR'
 25         WHERE id = p_id;
 26     END IF;
 27  END testproc;
 28  /

Procedure created.

测试:

SQL> EXEC testproc('12345', 'Little', 'Foot');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM table1;

ID    C_USER               PARTNER    SENDER     STATU
----- -------------------- ---------- ---------- -----
12345 Little                                     NEW

SQL> EXEC testproc('12345', 'Little', 'Foot');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM table1;

ID    C_USER               PARTNER    SENDER     STATU
----- -------------------- ---------- ---------- -----
12345 Little                                     ERR

SQL>

This code can't possibly return error you specified because

  1. procedure is invalid (mising statement terminators; column name can't be USER because it is a keyword, reserved for currently logged user)
  2. that error code is related to date issues, while - in your code - there's nothing that looks like a date

Therefore, it is impossible to help you with error you stated. Otherwise, consider NOT naming procedure's parameters the same as column names because that leads to various problems.

Something like this would work, but it is not related to error you got.

Sample table:

SQL> CREATE TABLE table1
  2  (
  3     id        VARCHAR2 (5),
  4     c_user    VARCHAR2 (20),
  5     partner   VARCHAR2 (10),
  6     sender    VARCHAR2 (10),
  7     status    VARCHAR2 (5)
  8  );

Table created.

SQL>

Procedure:

SQL> CREATE OR REPLACE PROCEDURE testProc (p_id      IN VARCHAR2,
  2                                        p_user    IN VARCHAR2,
  3                                        p_sender  IN VARCHAR2)
  4  AS
  5     vCount  NUMBER;
  6  BEGIN
  7     SELECT COUNT (*)
  8       INTO vCount
  9       FROM table1
 10      WHERE id = p_id;
 11
 12     IF vCount = 0
 13     THEN
 14        INSERT INTO table1 (id,
 15                            c_user,
 16                            sender,
 17                            status)
 18             VALUES (p_id,
 19                     p_user,
 20                     NULL,
 21                     'NEW');
 22     ELSE
 23        UPDATE table1
 24           SET status = 'ERR'
 25         WHERE id = p_id;
 26     END IF;
 27  END testproc;
 28  /

Procedure created.

Testing:

SQL> EXEC testproc('12345', 'Little', 'Foot');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM table1;

ID    C_USER               PARTNER    SENDER     STATU
----- -------------------- ---------- ---------- -----
12345 Little                                     NEW

SQL> EXEC testproc('12345', 'Little', 'Foot');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM table1;

ID    C_USER               PARTNER    SENDER     STATU
----- -------------------- ---------- ---------- -----
12345 Little                                     ERR

SQL>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文