语句

时间:2015-05-29 16:24:34

标签: arrays oracle plsql

我正在尝试准备一个函数,所以我已经启动了这个SQL草图来弄清楚如何管理我的情况:

 DECLARE

 x XMLType; 

begin
x := XMLType('<?xml version="1.0"?>
<ROWSET>
 <ROW> 
  <START_DATETIME>29/05/2015 14:23:00</START_DATETIME> 
 </ROW>
 <ROW> 
  <START_DATETIME>29/05/2015 17:09:00</START_DATETIME> 
 </ROW>
</ROWSET>');


  FOR r IN (
    SELECT ExtractValue(Value(p),'/ROW/START_DATETIME/text()') as deleted 
    FROM   TABLE(XMLSequence(Extract(x,'/ROWSET/ROW'))) p
    ) LOOP
    -- do whatever you want with r.name, r.state, r.city
    -- dbms_output.put_line( 'TO_DATE('''|| r.deleted ||''', '''|| 'DD/MM/YYYY HH24:MI:SS'')'); 
      dbms_output.put_line( ''''|| r.deleted ||''''); 
   DELETE  FROM MYTABLE a WHERE a.START_DATETIME not in (''''|| r.deleted || '''');

  END LOOP; 

END;

我已经尝试了不同的方法来在循环填充变量后执行查询但是却给我一个转换错误:

  
      
  1. 00000 - &#34;找到一个非数字字符,其中数字是预期的&#34;   *原因:使用日期格式模型转换的输入数据是          不正确。输入数据不包含数字所在的数字          格式模型要求。   *操作:修复输入数据或日期格式模型以确保          元素在数量和类型上匹配。然后重试该操作。
  2.   

有人能帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

你用一个明确的单引号包装一个字符串;这使得引号成为字符串本身的一部分,这是你不想要的。

您需要将字符串转换为数据类型,您可以在注释掉的部分中进行操作 - 在这种情况下,您需要为dbms_output()添加额外的引号以使其成为文本文字,并最终成为有效的to_date()电话;所以你最终得到了输出:

TO_DATE('29/05/2015 14:23:00', 'DD/MM/YYYY HH24:MI:SS')

但是对于你的删除,你只需要这样做:

DELETE FROM MYTABLE a
WHERE a.START_DATETIME not in (to_date(r.deleted, 'DD/MM/YYYY HH24:MI:SS'));

r.deleted的引用已经是一个字符串,所以你直接引用它,没有额外的引号。

您只有一个值,因此在使用not in的循环中此时不是必需的,您可以改为使用!=

DELETE FROM MYTABLE
WHERE START_DATETIME != to_date(r.deleted, 'DD/MM/YYYY HH24:MI:SS');

您的标题提到了一个数组,所以也许您真的打算将XML中的所有值放入(模式级类型)表集合中,然后在not in子句中使用它,因此它会删除所有内容< em>除了 XML中的日期。如果XML中有多个日期,那么像这样单独执行将有效地删除表中的所有内容,这也表明您要么使用数组,和/或实际上意味着in= 删除那些。

顺便说一句,extractValue()已被弃用,因此最好使用XMLQuery或XMLTable,例如:

  FOR r IN (
    SELECT *
    FROM XMLTable('/ROWSET/ROW/START_DATETIME'
      PASSING x COLUMNS deleted VARCHAR2(19) PATH '.')
    ) LOOP