Advertisement
Guest User

Процедура rpl_allfields

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