Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
PLSQL-将select查询结果存储在变量抛出错误中_Sql_Oracle_Plsql_Database Administration - Fatal编程技术网

PLSQL-将select查询结果存储在变量抛出错误中

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

我想将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: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,