PLSQL-将select查询结果存储在变量抛出错误中
我想将select查询结果存储在PLSQL中的变量中PLSQL-将select查询结果存储在变量抛出错误中,sql,oracle,plsql,database-administration,Sql,Oracle,Plsql,Database Administration,我想将select查询结果存储在PLSQL中的变量中 SQL>var v_storedate VARCHAR2(19); SQL>exec :v_storedate := 'select cdate from rprt where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002''; 作为 返回:2013/04/27-10:06:2
SQL>var v_storedate VARCHAR2(19);
SQL>exec :v_storedate := 'select cdate from rprt where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002'';
作为
返回:2013/04/27-10:06:26:794
但这会带来错误:
ERROR at line 1: ORA-06550: line 1, column 121: PLS-00103: Encountered
the symbol "YYYY" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_ between ||
multiset member SUBMULTISET_ The symbol "*" was substituted for "YYYY"
to continue. ORA-06550: line 1, column 148: PLS-00103: Encountered the
symbol ") and ryg=" when expecting one of the following: . ( * @ % & =
- + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_ between
第1行错误:ORA-06550:第1行第121列:PLS-00103:遇到错误
当预期出现以下情况之一时,使用符号“YYYY”:
* & = - + ; < / > at in是mod余数而不是rem或!=或~=>=at in是mod余数而不是rem或!=或者~=>=通过加倍来摆脱你内心的撇号 通过将内部撇号加倍来摆脱它们
- 将内部撇号加倍
- 并将
v_storedate
的数据类型更改为VARCHAR2(140)代码>
- 将内部撇号加倍
- 并将
v_storedate
的数据类型更改为VARCHAR2(140)代码>
在PL/SQL中,使用单引号处理文字的更好方法是引号语法:
。。。或使用匹配的分隔符
begin
variable := q'[select cdate from rprt where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002']'
...
end
您可以在SQL*Plus中尝试这一点。。。不确定它是否在那里工作。在PL/SQL中,使用单引号处理文字的更好方法是引号语法:
。。。或使用匹配的分隔符
begin
variable := q'[select cdate from rprt where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002']'
...
end
您可以在SQL*Plus中尝试这一点。。。不确定它是否在那里工作。如果要存储查询结果,则需要使用选择。。。进入
;此时,您正试图存储实际查询的文本,而不是其结果。如果您想这样做,您需要像其他答案所指出的那样转义单引号字符,并增加变量大小
var v_storedate VARCHAR2(19);
exec select cdate into :v_storedate from rprt where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002';
print v_storedate
使用普通的匿名块比使用SQL*Plus“execute
速记更容易处理。将其转换为字符串时,还应提供明确的日期格式掩码:
begin
select to_char(cdate, 'YYYY/MM/DD-HH24:MI:SS')
into :v_storedate
from rprt
where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS')
and ryg='R' and cnum='C002';
end;
/
如果你想要分数秒,那么你需要把你的变量变大,因为19个字符只会把你带到秒
无论哪种方式,您都有可能得到多个结果(这将给出ORA-02112
)或没有结果(这将给出ORA-01403
)。由于您的where
子句没有多大意义,而且表内容也不知道,所以我不知道哪种可能性更大。正如这里所指出的,您的cdate
比较总是正确的,而且您在其中进行隐式日期转换,这将在某个点中断。没有足够的信息为您解决此问题
无论如何,你不能从日期值中得到分数秒,只能从时间戳中得到分数秒;哪一个cdate
似乎是。但即使这样,格式元素也是FF[0-9]。SSSS是自午夜以来的秒数。但总体而言,to_char()
位看起来是错误的,这有点毫无意义。此外,如果您确实需要与当前时间进行比较,您可能应该与systimestamp
进行比较,而不是与sysdate
进行比较,以保持一致,然后不进行任何转换
如果只需要日期部分:
var v_storedate VARCHAR2(10);
begin
select to_char(cdate, 'YYYY/MM/DD')
into :v_storedate
...
如果愿意,您仍然可以使用exec
,但一旦语句长度超过终端行长度,它的可读性就会降低:
var v_storedate VARCHAR2(10);
exec select to_char(cdate, 'YYYY/MM/DD') into :v_storedate from ... where ... ;
如果要存储查询结果,则需要使用select。。。进入
;此时,您正试图存储实际查询的文本,而不是其结果。如果您想这样做,您需要像其他答案所指出的那样转义单引号字符,并增加变量大小
var v_storedate VARCHAR2(19);
exec select cdate into :v_storedate from rprt where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002';
print v_storedate
使用普通的匿名块比使用SQL*Plus“execute
速记更容易处理。将其转换为字符串时,还应提供明确的日期格式掩码:
begin
select to_char(cdate, 'YYYY/MM/DD-HH24:MI:SS')
into :v_storedate
from rprt
where cdate between cdate AND TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS')
and ryg='R' and cnum='C002';
end;
/
如果你想要分数秒,那么你需要把你的变量变大,因为19个字符只会把你带到秒
无论哪种方式,您都有可能得到多个结果(这将给出ORA-02112
)或没有结果(这将给出ORA-01403
)。由于您的where
子句没有多大意义,而且表内容也不知道,所以我不知道哪种可能性更大。正如这里所指出的,您的cdate
比较总是正确的,而且您在其中进行隐式日期转换,这将在某个点中断。没有足够的信息为您解决此问题
无论如何,你不能从日期值中得到分数秒,只能从时间戳中得到分数秒;哪一个cdate
似乎是。但即使这样,格式元素也是FF[0-9]。SSSS是自午夜以来的秒数。但总体而言,to_char()
位看起来是错误的,这有点毫无意义。此外,如果您确实需要与当前时间进行比较,您可能应该与systimestamp
进行比较,而不是与sysdate
进行比较,以保持一致,然后不进行任何转换
如果只需要日期部分:
var v_storedate VARCHAR2(10);
begin
select to_char(cdate, 'YYYY/MM/DD')
into :v_storedate
...
如果愿意,您仍然可以使用exec
,但一旦语句长度超过终端行长度,它的可读性就会降低:
var v_storedate VARCHAR2(10);
exec select to_char(cdate, 'YYYY/MM/DD') into :v_storedate from ... where ... ;
将它们加倍后,会出现以下错误:第1行错误:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:第1行错误:var v_storedate VARCHAR2(19);将上述行更改为SQL>var v_storedate VARCHAR2(140);将它们加倍后,会出现以下错误:第1行错误:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:第1行错误:var v_storedate VARCHAR2(19);将上述行更改为SQL>var v_storedate VARCHAR2(140)<代码>SQL>var v_storedate VARCHAR2(140);SQL>exec:v_storedate:=“从rprt中选择cdate,其中cdate介于cdate和TO_CHAR之间(sysdate,“YYYY/MM/DD-HH24-MI-SS-SSSSS”)和ryg=“R”和cnum=“C002”代码>开始:v_storedate:='从rprt中选择cdate,其中cdate和TO_CHAR之间的日期(sysdate,