在PL / sql中使用OR条件更新查询

时间:2016-06-16 09:29:35

标签: plsql

我在PL / SQL中有一个更新查询,我需要根据itemsetid =' XXXX或orgid =' YYYYY'这是因为并非所有表都有这两个字段所以我需要使用OR条件。我尝试如下,但它不起作用,

   set serveroutput on size unlimited ;
declare 
type item_type 
is record (
 maxSameas maxattribute.sameasattribute%TYPE,
 maxTable  maxattribute.objectname%TYPE,
 maxAttrib maxattribute.attributename%TYPE
);
Type attribArray is table of item_type;
allAttribs attribArray;
cursor ITEM_ATTRIB_CURSOR is 
select a.sameasattribute, a.objectname, a.attributename
from maxattribute a, maxobject b
where a.persistent = 1 
and a.objectname = b.objectname 
and b.persistent = 1
and ((a.sameasattribute is not null 
  and a.sameasattribute like 'ITEMNUM')
  or (a.attributename = 'ITEMNUM')) 
 and a.objectname <> 'ITEMHIST'
--  and a.objectname <> 'ITEM' 
 and b.isView = '0'
 order by a.objectname asc, a.attributename asc, a.sameasattribute desc;
 type itemXrefType 
  is record (
  currValue itemhist.ITEMNUM%type,
 oldValue  itemhist.OLDITEMNUM%type
);
type itemXrefTable is table of itemXrefType;
 itemXref itemXrefTable;
 cursor ITEM_VAL_CURSOR is
select itemnum, olditemnum
from itemhist 
where olditemnum is not null and itemsetid='XXXXX';    
updateStr varchar2 (4000);
queryStr varchar2 (4000);
tableName varchar2 (30);
attribName varchar2(50);
rowKount NUMBER;
 begin
 DBMS_OUTPUT.ENABLE(NULL);
-- Fetch Cross Reference Data
  open item_val_cursor;
 fetch item_val_cursor bulk collect into itemXref;
 close item_val_cursor;  
       -- Fetch all Objects with ITEMNUM attribute
open  ITEM_ATTRIB_CURSOR;
fetch ITEM_ATTRIB_CURSOR bulk collect into allAttribs;
close ITEM_ATTRIB_CURSOR;    
  -- Loop through every Object    
   for i in allAttribs.first..allAttribs.last loop  
    tableName := allAttribs(i).maxTable;
    if (tableName = 'ITEM') then
    attribName := 'ITEMNUM';
     else
      attribName := allAttribs(i).maxAttrib;
     end if;      
     for j in itemXref.first .. itemXref.last loop       
     -- For each Item Num, update all objects
       queryStr := 'select count (1) from ' || tableName || 
                ' where ' || attribName || '='  || '''' ||     itemXref(j).oldValue || '''';        
    -- Get Count before update
    EXECUTE IMMEDIATE queryStr into RowKount;
    updateStr := 'update ' || tableName || 
          ' set '  || attribName || ' = ' || '''' || itemXref(j).currValue   
         || ''' where ' || attribName || '='  || '''' || itemXref(j).oldValue || ''' and (itemsetid = ''' || 'XXXX' || ''' or orgid = ''' || 'YYYYY' || ''' ) '''  '''';        
    --dbms_output.put_line (itemXref(j).currValue || ' ::::' || itemXref(j).oldValue);
    dbms_output.put_line (updateStr || ':: Records to be updated is ' || rowKount);        
    -- Execute the Update 
    EXECUTE IMMEDIATE updateStr;        
    -- Commit changes
    updateStr := 'Commit';
    EXECUTE IMMEDIATE updateStr;        
    -- Get count after update - should be none!
    EXECUTE IMMEDIATE queryStr into RowKount;
    dbms_output.put_line (' Count of records after the update is ' || rowKount);        
  end loop;     
end loop; --for i in allAttribs
    end;

提前致谢!

0 个答案:

没有答案