这个函数在做啥

Posted

技术标签:

【中文标题】这个函数在做啥【英文标题】:what is this function doing这个函数在做什么 【发布时间】:2018-09-12 14:09:47 【问题描述】:

我是函数新手,想知道是否有人可以告诉我这个函数在做什么?它正在将 '8/20/20118' 转换为 0。

CREATE OR REPLACE FUNCTION ISDATE(v_date IN VARCHAR2) RETURN number IS
    v_date1 DATE;
BEGIN
    select to_date(v_date,'mm/dd/yyyy') into v_date1 from dual;
        RETURN 1;
    Exception WHEN Others THEN
        RETURN 0;
END;

我不明白这部分。

ISDATE(v_date IN VARCHAR2) 返回数字 IS v_date1 日期

【问题讨论】:

就是函数定义。你不明白什么? 20118年是个很奇怪的年份... @Aleksej - 这就是它抛出异常并返回零的原因 *8-) 那么它是否真的在检查 isdate 函数,即使它在 oracle 中? 函数is explained in the documentation的结构。你没有得到什么?您的示例相当简单,没有使用任何晦涩难懂的语法或技巧? 【参考方案1】:
CREATE OR REPLACE FUNCTION              -- You are creating or replacing a function in the
                                        -- database
ISDATE                                  -- The name of the function is "ISDATE"
(
  v_date IN VARCHAR2                    -- The function takes one argument called "v_date"
                                        -- which is an IN(put) parameter of the VARCHAR2
                                        -- (string) data type
)
RETURN number                           -- The function returns a number
IS
  v_date1 DATE;                         -- The function has one local variable "v_date1"
                                        -- which is of the DATE data type.
BEGIN                                   -- The start of the main body of the function
  select to_date(v_date,'mm/dd/yyyy')   -- Try to convert the v_date argument to a date
                                        -- using the mm/dd/yyyy format model
  into v_date1                          -- and put the result into the v_date1 variable
  from dual;                            -- Using the DUAL table supplied by Oracle.
  RETURN 1;                             -- If successful then return 1
Exception                               -- If there was an error then...
  WHEN Others THEN                      --   When the error was not matched by another rule
    RETURN 0;                           --     return 0
END;                                    -- End the function.

【讨论】:

谢谢。为什么该功能有效,但 CASE WHEN to_char('8/20/20118') = TO_DATE('8/20/20118','MM/DD/YYYY') THEN 1 ELSE 0 END AS TTTTT 不起作用? @smattiko84 因为TO_DATE 会在格式模型与日期字符串不匹配并且PL/SQL 函数有一个异常处理块可以捕获它但SQL 语句没有时抛出异常。使用TO_CHAR 进行隐式数据类型转换还有其他问题,但这对于在评论中回复来说太复杂了。【参考方案2】:

它正在检查输入字符串是否可以使用指定的格式转换为日期,如果可以或不能,则分别返回 1 或 no。

【讨论】:

那么 ISDATE(v_date IN VARCHAR2) RETURN number IS v_date1 DATE 是做什么的? @smattiko84 即参数声明和返回值【参考方案3】:

正如in the documentation解释的那样:

ISDATE是函数名。

(v_date IN VARCHAR2)为参数声明;在这种情况下,有一个输入(IN,表示它在函数内是只读的)参数,它期望一个字符串值;该参数称为v_date,因此您可以使用该名称来引用函数体内传入的值。

RETURN number 表示该函数返回的值是 number

IS 表示您已经完成了参数/返回声明,并正在继续进行可选的局部变量声明和函数体。

v_date1 DATE 正在声明一个 date 类型的局部变量,称为 v_date1

【讨论】:

谢谢。为什么该功能有效,但 CASE WHEN to_char('8/20/20118') = TO_DATE('8/20/20118','MM/DD/YYYY') THEN 1 ELSE 0 END AS TTTTT 不起作用? @smattiko84 - 因为函数的异常处理程序。在您的声明中,to_char('8/20/20118') 正在将字符串转换为字符串,这是毫无意义的。 TO_DATE('8/20/20118','MM/DD/YYYY') 将在有机会评估 case 表达式之前抛出 ORA-01830。 (如果你使用了一个有效的日期,无论如何你都必须进行隐式转换来比较这些值,所以它不会告诉你太多。) 谢谢。什么是异常处理程序? exception when others ... 部分。 (使用when others 通常是个坏主意,因为它经常会意外隐藏问题。在这里还可以……但不要养成在任何地方都包含它的习惯。)

以上是关于这个函数在做啥的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js --prof 输出中,这个名字奇怪的 C++ 函数在做啥?

将 unsigned char* 转换为可读字符串 & 这个函数在做啥

这段代码中的 lambda 函数在做啥? [复制]

我在做啥的 Python 多处理进程或池?

-fno-builtin 到底在做啥?

PHP AES 加密...不知道我在做啥