sql - Oracle 中的异常处理

标签 sql oracle exception exception-handling parseint

我正在尝试解析作为字符串输入的年份(请不要让我开始 - 它就是这样)。然而,输入的年份不能被 TO_NUMBER 解析。 .

WITH src AS (
        SELECT '2000' AS y FROM DUAL
  UNION SELECT '1991' AS y FROM DUAL
  UNION SELECT '20--' AS y FROM DUAL
  UNION SELECT '09' AS y FROM DUAL
  UNION SELECT '11' AS y FROM DUAL
  UNION SELECT '95' AS y FROM DUAL
)

BEGIN
  SELECT
    s.y,
    TO_NUMBER(s.y) AS p
  FROM src s
EXCEPTION
  WHEN INVALID_NUMBER THEN NULL
END

我从未在 Oracle 中进行过异常处理,如果这是一个基本问题,我深表歉意。

运行上面的查询时,我得到 ORA-00928: missing SELECT keyword然后它突出显示 BEGIN关键词。通过四处搜索,我看到人们所做的就是使用 BEGIN SELECT这也是我正在做的。我猜我在别的地方搞砸了?

基本上我想做的是解析字符串,如果抛出异常,我会将其设置为 NULL .

编辑

我尝试了一种不同的方法并添加了一些分号,正如@DavidFaber 在下面评论的那样。
BEGIN
  SELECT
    s.y,
    TO_NUMBER(s.y) AS p
  FROM (
          SELECT '2000' AS y FROM DUAL
    UNION SELECT '1991' AS y FROM DUAL
    UNION SELECT '20--' AS y FROM DUAL
    UNION SELECT '09' AS y FROM DUAL
    UNION SELECT '11' AS y FROM DUAL
    UNION SELECT '95' AS y FROM DUAL
  ) s;
EXCEPTION
  WHEN INVALID_NUMBER THEN NULL;
END;

我现在收到一个不同的错误 ORA-06550: line 2, column 3: PLS-00428: an INTO clause is expected in this SELECT statement .

最佳答案

There's no exception-handling in SQL;



是的,这是真的,但有像内联函数(Oracle 12c)这样的解决方法:
WITH FUNCTION safe_to_NUMBER(input IN VARCHAR2)
RETURN NUMBER IS
i NUMBER;
BEGIN
  i:= TO_NUMBER(input);

  RETURN i;
  EXCEPTION
  WHEN OTHERS THEN 
    RETURN NULL;
END;
SELECT  sub.y, safe_to_NUMBER(sub.y)
FROM (
    SELECT '2000' AS y FROM DUAL UNION ALL
    SELECT '1991' AS y FROM DUAL UNION ALL
    SELECT '20--' AS y FROM DUAL UNION ALL
    SELECT '09' AS y FROM DUAL UNION ALL
    SELECT '11' AS y FROM DUAL UNION ALL
    SELECT '95' AS y FROM DUAL
  ) sub;

结果:
Y    SAFE_TO_NUMBER(SUB.Y)
---- ---------------------
2000                  2000
1991                  1991
20--                      
09                       9
11                      11
95                      95

6 rows selected. 

我当然不会写这样的生产代码:)

正确方法(DEFAULT NULL ON CONVERSION ERROR - 从 Oracle12cR2 开始可用):
SELECT sub.y, TO_NUMBER(sub.y DEFAULT NULL ON CONVERSION ERROR) AS y
FROM (
    SELECT '2000' AS y FROM DUAL UNION ALL
    SELECT '1991' AS y FROM DUAL UNION ALL
    SELECT '20--' AS y FROM DUAL UNION ALL
    SELECT '09' AS y FROM DUAL UNION ALL
    SELECT '11' AS y FROM DUAL UNION ALL
    SELECT '95' AS y FROM DUAL
  ) sub;

输出:
Y             Y
---- ----------
2000       2000
1991       1991
20--           
09            9
11           11
95           95

6 rows selected. 

关于sql - Oracle 中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50725046/

相关文章:

c# - SQL Server CE错误不允许访问数据库文件

mysql - 分离 SQL 表,同时仍允许连接

oracle - 如何使用 JdbcTemplate(或普通 JDBC)从 Oracle 获取小写字符列的生成键

sql - 如何在匿名 PL/SQL block 中使用重复占位符名称?

unit-testing - 参数异常应该进行单元测试吗?

mysql - 在没有唯一索引/约束的情况下防止 MySQL 中的重复行?

php - 数据库查询未返回完整字符串

Spring Boot 应用程序 url 不能为空

java - 如果所请求的 key 不存在,应该抛出什么异常?

c# - 使用 JSON 在两个 C# 程序之间传递异常