Advertisement
Guest User

Процедура rpl_somefields

a guest
Apr 19th, 2011
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 6.20 KB | None | 0 0
  1. CREATE OR ALTER PROCEDURE rpl_somefields (
  2.     TABLE_NAME my_docnumber,
  3.     is_docheader my_boolean)
  4. AS
  5. DECLARE variable table_id INTEGER;
  6. DECLARE variable field_type INTEGER;
  7. DECLARE variable field_null INTEGER;
  8. DECLARE variable field_name VARCHAR(64);
  9. DECLARE variable field_count INTEGER;
  10. DECLARE variable field_num INTEGER;
  11. DECLARE variable out_sql VARCHAR(32000);
  12. BEGIN
  13. /*
  14. table rpl_log:
  15. ID         identifier
  16. SESSION_ID fc to rpl_sessions
  17. REC_SQL    generated sql
  18. */
  19.   TABLE_NAME = UPPER(:TABLE_NAME);
  20.   SELECT id FROM rpl_tables WHERE UPPER(TABLE_NAME) = :TABLE_NAME
  21.     INTO table_id;
  22.   SELECT COUNT(f.id)
  23.     FROM rpl_fields f
  24.     WHERE f.table_id = :table_id
  25.     INTO field_count;
  26. /*
  27. trigger after insert
  28. */
  29.   out_sql = 'create or alter trigger ' || :TABLE_NAME || '_REPL for ' || :TABLE_NAME || ' ' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  30.             'active after insert or update or delete position 255' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  31.             'as' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  32.             'declare variable sql_text varchar(1024);' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  33.             'begin' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  34.             '  if ((select rdb$get_context(''USER_SESSION'', ''replicating_now'') from rdb$database)is not null) then exit;' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  35.             '  if (inserting) then begin' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  36.             '    insert into rpl_log(RPL_SQL)' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  37.             '      values (''insert into ' || :TABLE_NAME || ' (' ;
  38.  
  39.   field_num = 1;
  40.   FOR SELECT rdb$field_name
  41.     FROM rdb$relation_fields r, rpl_fields f
  42.     WHERE rdb$relation_name = :TABLE_NAME
  43.     AND rdb$field_name = UPPER(f.field_name)
  44.     AND f.table_id = :table_id
  45.     ORDER BY rdb$field_position
  46.     INTO field_name
  47.   do BEGIN
  48.     IF (:field_num = :field_count)
  49.       THEN out_sql = :out_sql || TRIM(:field_name);
  50.       ELSE out_sql = :out_sql || TRIM(:field_name) || ',' ;
  51.     field_num = :field_num + 1;
  52.   END
  53.   out_sql = :out_sql || ')values('' ||' || ASCII_CHAR(13) || ASCII_CHAR(10);
  54.  
  55.   field_num = 1;
  56.   FOR SELECT UPPER(rp.field_name), f.rdb$field_type, rf.rdb$null_flag
  57.     FROM rpl_fields rp
  58.     LEFT JOIN rdb$relation_fields rf ON UPPER(rp.field_name) = rf.rdb$field_name
  59.     LEFT JOIN rdb$fields f ON rf.rdb$field_source = f.rdb$field_name
  60.     WHERE rdb$relation_name = :TABLE_NAME
  61.     AND rp.table_id = :table_id
  62.     ORDER BY rdb$field_position
  63.     INTO field_name, field_type, field_null
  64.   do BEGIN
  65.     IF (:field_type IN (12,13,35,37)) THEN BEGIN
  66.     --needed quotes
  67.       IF (:field_null = 1)
  68.         THEN field_name = ''''' || new.' || :field_name || ' || ''''';
  69.         ELSE field_name = 'coalesce('''''''' || new.' || :field_name || ' || '''''''', ''null'')';
  70.     END ELSE BEGIN
  71.     --clear digits
  72.       IF (:field_null = 1)
  73.         THEN field_name = 'new.' || :field_name;
  74.         ELSE field_name = 'coalesce(new.' || :field_name || ', ''null'')';
  75.     END
  76.  
  77.     IF (:field_num = :field_count)
  78.       THEN out_sql = :out_sql || '      ' || :field_name || '||'');'' ' || ');' || ASCII_CHAR(13) || ASCII_CHAR(10);
  79.       ELSE out_sql = :out_sql || '      ' || :field_name || '||'',''||' || ASCII_CHAR(13) || ASCII_CHAR(10);
  80.     field_num = :field_num + 1;
  81.   END
  82.  
  83.   out_sql = :out_sql || '  end ' || ASCII_CHAR(13) || ASCII_CHAR(10);
  84.  
  85. /*
  86. trigger after update
  87. */
  88.   out_sql = :out_sql ||
  89.             '  if (updating)';
  90.   IF (:is_docheader = 1) THEN
  91.     out_sql = :out_sql || ' then if (new.commited <> old.commited)';
  92.   out_sql = :out_sql ||
  93.             ' then begin ' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  94.             '    sql_text = ''update '|| :TABLE_NAME || ' set '';' || ASCII_CHAR(13) || ASCII_CHAR(10);
  95.   field_num = 1;
  96.   FOR SELECT UPPER(rp.field_name), f.rdb$field_type, rf.rdb$null_flag
  97.     FROM rpl_fields rp
  98.     LEFT JOIN rdb$relation_fields rf ON UPPER(rp.field_name) = rf.rdb$field_name
  99.     LEFT JOIN rdb$fields f ON rf.rdb$field_source = f.rdb$field_name
  100.     WHERE rdb$relation_name = :TABLE_NAME
  101.     AND rp.table_id = :table_id
  102.     ORDER BY rdb$field_position
  103.     INTO field_name, field_type, field_null
  104.   do BEGIN
  105.     out_sql = :out_sql || '    if (old.' || :field_name || ' is distinct from new.' || :field_name || ') then' || ASCII_CHAR(13) || ASCII_CHAR(10);
  106.     IF (:field_type IN (12,13,35,37)) THEN BEGIN
  107.     --needed quotes
  108.       IF (:field_null = 1)
  109.         THEN out_sql = :out_sql || '      sql_text = :sql_text || '' ' || :field_name || ' = '''''' || new.' || :field_name || ' || '''''','';' || ASCII_CHAR(13) || ASCII_CHAR(10);
  110.         ELSE out_sql = :out_sql || '      sql_text = :sql_text || '' ' || :field_name || ' = '''''' || new.' || :field_name || ' || '''''','';' || ASCII_CHAR(13) || ASCII_CHAR(10);
  111.     END ELSE BEGIN
  112.     --clear digits
  113.       IF (:field_null = 1)
  114.         THEN out_sql = :out_sql || '      sql_text = :sql_text || '' ' || :field_name || ' = '' || new.' || :field_name || ' || '','';' || ASCII_CHAR(13) || ASCII_CHAR(10);
  115.         ELSE out_sql = :out_sql || '      sql_text = :sql_text || '' ' || :field_name || ' = '' || new.' || :field_name || ' || '','';' || ASCII_CHAR(13) || ASCII_CHAR(10);
  116.     END
  117.   END
  118.   out_sql = :out_sql || '    sql_text = substring(:sql_text from 1 for char_length(:sql_text) - 1);' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  119.                         '    sql_text = :sql_text || '' where id = '' || old.id || '';'' ;' || ASCII_CHAR(13) || ASCII_CHAR(10);
  120.   out_sql = :out_sql || '    insert into rpl_log(RPL_SQL)' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  121.                         '      values (:sql_text);' || ASCII_CHAR(13) || ASCII_CHAR(10);
  122.   out_sql = :out_sql || '  end ' || ASCII_CHAR(13) || ASCII_CHAR(10);
  123.  
  124. /*
  125. trigger after delete
  126. */
  127.  
  128.   out_sql =  :out_sql ||
  129.             '  if (deleting) then begin' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  130.             '    insert into rpl_log(RPL_SQL)' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  131.             '      values (''delete from ' || :TABLE_NAME || ' where id = '' ||  old.id  || '';'');' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  132.             '  end' || ASCII_CHAR(13) || ASCII_CHAR(10) ||
  133.             'end' || ASCII_CHAR(13) || ASCII_CHAR(10);
  134.   EXECUTE statement :out_sql;
  135. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement