Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL新手:带有SELECT和SYSDATE的函数_Sql_Oracle_Plsql - Fatal编程技术网

PL/SQL新手:带有SELECT和SYSDATE的函数

PL/SQL新手:带有SELECT和SYSDATE的函数,sql,oracle,plsql,Sql,Oracle,Plsql,我是SQL新手,希望能得到一些帮助,将其转化为函数: SELECT SYSDATE "Today's Date", NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')"First Tuesday this Month", NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY') "First Tuesday of Next Month" FROM DUAL; CREATE OR REPLACE FUNCTION first_t

我是SQL新手,希望能得到一些帮助,将其转化为函数:

SELECT 
SYSDATE "Today's Date",
NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')"First Tuesday this Month",
NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY') "First Tuesday of Next Month"
FROM DUAL;
CREATE OR REPLACE FUNCTION first_tuesday (sysdate_in date)
  RETURN DATE
AS
BEGIN
  RETURN NEXT_DAY(trunc(sysdate_in, 'MONTH')-1, 'Tuesday')
END;
/
下面是我将上述内容转换为函数的尝试(正如您所看到的,它并没有变得如此热门)


我做错了什么

您确实在尝试返回三个值。我建议将其分解为单独的函数,但将“今天的日期”作为对sysdate的调用

您不需要发出SELECT查询来填充变量,在这种情况下,您只需返回一个表达式即可

CREATE OR REPLACE FUNCTION first_tuesday
  RETURN DATE
AS
BEGIN
  RETURN NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')
END;
/
这里需要注意的是,在SQL语句的执行过程中,SYSDATE始终具有相同的值,但PL/SQL中并非如此。因此,当在从SQL语句调用的PL/SQL中计算sysdate时,可以在每个上下文中获得不同的值。因此,如果你打电话:

select sysdate col1,
       some_function col2
from dual;
。。。在长时间执行期间,某些函数计算sysdate,它可能使用与父SQL语句稍有不同(更晚)的值

避免这种情况的方法是将sysdate传递给函数:

SELECT 
SYSDATE "Today's Date",
NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')"First Tuesday this Month",
NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY') "First Tuesday of Next Month"
FROM DUAL;
CREATE OR REPLACE FUNCTION first_tuesday (sysdate_in date)
  RETURN DATE
AS
BEGIN
  RETURN NEXT_DAY(trunc(sysdate_in, 'MONTH')-1, 'Tuesday')
END;
/
那么你可能

Select ...
From   invoices
Where  invoice_date < first_tuesday(sysdate)
。。。不是

NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY')

你真的在尝试返回三个值。我建议将其分解为单独的函数,但将“今天的日期”作为对sysdate的调用

您不需要发出SELECT查询来填充变量,在这种情况下,您只需返回一个表达式即可

CREATE OR REPLACE FUNCTION first_tuesday
  RETURN DATE
AS
BEGIN
  RETURN NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')
END;
/
这里需要注意的是,在SQL语句的执行过程中,SYSDATE始终具有相同的值,但PL/SQL中并非如此。因此,当在从SQL语句调用的PL/SQL中计算sysdate时,可以在每个上下文中获得不同的值。因此,如果你打电话:

select sysdate col1,
       some_function col2
from dual;
。。。在长时间执行期间,某些函数计算sysdate,它可能使用与父SQL语句稍有不同(更晚)的值

避免这种情况的方法是将sysdate传递给函数:

SELECT 
SYSDATE "Today's Date",
NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')"First Tuesday this Month",
NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY') "First Tuesday of Next Month"
FROM DUAL;
CREATE OR REPLACE FUNCTION first_tuesday (sysdate_in date)
  RETURN DATE
AS
BEGIN
  RETURN NEXT_DAY(trunc(sysdate_in, 'MONTH')-1, 'Tuesday')
END;
/
那么你可能

Select ...
From   invoices
Where  invoice_date < first_tuesday(sysdate)
。。。不是

NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY')

一个函数只能返回一件事。是否希望函数返回一个表示下个月第一个星期二的日期?是否希望函数返回包含三个不同
date
列的记录?还是要执行其他操作?函数只能返回一项操作。是否希望函数返回一个表示下个月第一个星期二的日期?是否希望函数返回包含三个不同
date
列的记录?或者你想做些别的事情吗?+1尤其是你的“大多数从业者”建议。除非在第一个星期二的派生中有其他规则,否则我会选择使用本机SQL函数。谢谢,我仍然无法显示结果,但是:调用“first_Tuesday”时参数的数量或类型错误。我同意创建函数不是最简单的方法。@user3245946最好发布函数的定义和调用方式。+1尤其是对于“大多数从业者”的建议。除非在第一个星期二的派生中有其他规则,否则我会选择使用本机SQL函数。谢谢,我仍然无法显示结果,但是:调用“first_Tuesday”时参数的数量或类型错误。我同意创建函数不是最简单的方法。@user3245946最好发布函数的定义和调用方法。