<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Counter_postupu_procesu_pro_hromadn%C3%A9_operace</id>
	<title>Counter postupu procesu pro hromadné operace - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Counter_postupu_procesu_pro_hromadn%C3%A9_operace"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Counter_postupu_procesu_pro_hromadn%C3%A9_operace&amp;action=history"/>
	<updated>2026-05-12T22:43:18Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Counter_postupu_procesu_pro_hromadn%C3%A9_operace&amp;diff=490&amp;oldid=prev</id>
		<title>imported&gt;Pavel: Založena nová stránka: Při zpracování hromadných operací není jasné, kolik řádků již bylo zpracováno. PostgreSQL nenabízí, žádný způsob jak se dozvědět, kolik řádek bylo zpr...</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Counter_postupu_procesu_pro_hromadn%C3%A9_operace&amp;diff=490&amp;oldid=prev"/>
		<updated>2010-11-10T18:43:20Z</updated>

		<summary type="html">&lt;p&gt;Založena nová stránka: Při zpracování hromadných operací není jasné, kolik řádků již bylo zpracováno. PostgreSQL nenabízí, žádný způsob jak se dozvědět, kolik řádek bylo zpr...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Při zpracování hromadných operací není jasné, kolik řádků již bylo zpracováno. PostgreSQL nenabízí, žádný způsob jak se dozvědět, kolik řádek bylo zpracováno:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE source_table(..);&lt;br /&gt;
CREATE TABLE destination_table(..);&lt;br /&gt;
&lt;br /&gt;
/* transformation function */&lt;br /&gt;
CREATE OR REPLACE FUNCTION to_destination_table(source_table) RETURNS RECORD AS $$ ...&lt;br /&gt;
&lt;br /&gt;
/* transformation */&lt;br /&gt;
INSERT INTO destination_table&lt;br /&gt;
SELECT (r).*&lt;br /&gt;
FROM (SELECT to_destionation_table(_source) r&lt;br /&gt;
FROM source _source) x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Proto jsem si napsal malou funkci, která pouze počítá počet svých volání a po dosažení nastaveného počtu zobrazí echo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;funcapi.h&amp;quot;&lt;br /&gt;
#include &amp;quot;utils/lsyscache.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PG_FUNCTION_INFO_V1(pst_counter);&lt;br /&gt;
&lt;br /&gt;
Datum pst_counter(PG_FUNCTION_ARGS);&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
   long int iterations;&lt;br /&gt;
   int freq;&lt;br /&gt;
   Oid typoutput;&lt;br /&gt;
} counter_cache;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
* raise notice every n call,&lt;br /&gt;
* returns input without change&lt;br /&gt;
*/&lt;br /&gt;
Datum&lt;br /&gt;
pst_counter(PG_FUNCTION_ARGS)&lt;br /&gt;
{&lt;br /&gt;
   Datum value = PG_GETARG_DATUM(0);&lt;br /&gt;
   counter_cache *ptr = (counter_cache *) fcinfo-&amp;gt;flinfo-&amp;gt;fn_extra;&lt;br /&gt;
&lt;br /&gt;
   if (ptr == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      fcinfo-&amp;gt;flinfo-&amp;gt;fn_extra = MemoryContextAlloc(fcinfo-&amp;gt;flinfo-&amp;gt;fn_mcxt,&lt;br /&gt;
                                                                         sizeof(counter_cache));&lt;br /&gt;
      ptr = (counter_cache *) fcinfo-&amp;gt;flinfo-&amp;gt;fn_extra;&lt;br /&gt;
      ptr-&amp;gt;iterations = 0;&lt;br /&gt;
      ptr-&amp;gt;typoutput = InvalidOid;&lt;br /&gt;
 &lt;br /&gt;
      if (PG_ARGISNULL(1))&lt;br /&gt;
         elog(ERROR, &amp;quot;second parameter (output frequency) must not be NULL&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      ptr-&amp;gt;freq = PG_GETARG_INT32(1);&lt;br /&gt;
&lt;br /&gt;
      if (!PG_ARGISNULL(2) &amp;amp;&amp;amp; PG_GETARG_BOOL(2))&lt;br /&gt;
      {&lt;br /&gt;
         Oid valtype;&lt;br /&gt;
         Oid typoutput;&lt;br /&gt;
         bool typIsVarlena;&lt;br /&gt;
&lt;br /&gt;
         valtype = get_fn_expr_argtype(fcinfo-&amp;gt;flinfo, 0);&lt;br /&gt;
         getTypeOutputInfo(valtype, &amp;amp;typoutput, &amp;amp;typIsVarlena);&lt;br /&gt;
         ptr-&amp;gt;typoutput = typoutput;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if (++ptr-&amp;gt;iterations % ptr-&amp;gt;freq == 0)&lt;br /&gt;
   {&lt;br /&gt;
      if (!OidIsValid(ptr-&amp;gt;typoutput))&lt;br /&gt;
      {&lt;br /&gt;
         elog(NOTICE, &amp;quot;processed %ld rows&amp;quot;, ptr-&amp;gt;iterations);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         /* show a processed row, when it&amp;#039;s requested */&lt;br /&gt;
         if (PG_ARGISNULL(0))&lt;br /&gt;
            elog(NOTICE, &amp;quot;processed %ld rows, current value is null&amp;quot;, ptr-&amp;gt;iterations);&lt;br /&gt;
         else&lt;br /&gt;
         {&lt;br /&gt;
            elog(NOTICE, &amp;quot;processed %ld rows, current value is &amp;#039;%s&amp;#039;&amp;quot;, ptr-&amp;gt;iterations,&lt;br /&gt;
                                                   OidOutputFunctionCall(ptr-&amp;gt;typoutput, value));&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   PG_RETURN_DATUM(value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION counter(anyelement, int, bool)&lt;br /&gt;
RETURNS anyelement&lt;br /&gt;
AS &amp;#039;MODULE_PATHNAME&amp;#039;,&amp;#039;pst_counter&amp;#039; LANGUAGE C;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Použití je triviální:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* transformation */&lt;br /&gt;
INSERT INTO destination_table&lt;br /&gt;
SELECT (r).*&lt;br /&gt;
FROM (SELECT counter(to_destionation_table(_source), 1000, true) r&lt;br /&gt;
FROM source _source) x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Výsledek:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1230000 rows, current value is &amp;#039;(959674199,&amp;quot;2010-10-25 23:50:29.404568&amp;quot;,&amp;quot;2010-10-25 23:50:29.491842&amp;quot;,,3,501,190000029,XXXXXX,f,9,21)&amp;#039;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1240000 rows, current value is &amp;#039;(959473959,&amp;quot;2010-10-25 19:20:52.498152&amp;quot;,&amp;quot;2010-10-25 19:20:52.564384&amp;quot;,,3,501,189854563,XXXXXX,f,9,23)&amp;#039;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1250000 rows, current value is &amp;#039;(958884965,&amp;quot;2010-10-25 08:53:30.026877&amp;quot;,&amp;quot;2010-10-25 08:53:30.106039&amp;quot;,,3,101,189849045,XXXXXX,f,13,48)&amp;#039;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1260000 rows, current value is &amp;#039;(959483959,&amp;quot;2010-10-25 19:32:02.136491&amp;quot;,&amp;quot;2010-10-25 19:32:04.070922&amp;quot;,,3,500,189969079,XXXXXX,f,9,48)&amp;#039;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1270000 rows, current value is &amp;#039;(959488959,&amp;quot;2010-10-25 19:36:40.691078&amp;quot;,&amp;quot;2010-10-25 19:36:41.155615&amp;quot;,,3,500,189037026,,f,9,)&amp;#039;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1280000 rows, current value is &amp;#039;(959493959,&amp;quot;2010-10-25 19:41:59.21508&amp;quot;,&amp;quot;2010-10-25 19:41:59.244398&amp;quot;,,3,101,189971167,XXXXXX,f,13,42)&amp;#039;&lt;br /&gt;
psql84:convert.sql:183: NOTICE: processed 1290000 rows, current value is &amp;#039;(959498959,&amp;quot;2010-10-25 19:49:22.494294&amp;quot;,&amp;quot;2010-10-25 19:49:22.516124&amp;quot;,,3,1010,189971599,XXXXXX,f,9,53)&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>