pdf viewer dll for c# : Add image to pdf file acrobat Library software class asp.net wpf windows ajax postgresql-9.4-A4114-part2740

Chapter 40. PL/pgSQL - SQL Procedural Language
RAISE EXCEPTION ’Nonexistent ID --> %’, user_id
USING HINT = ’Please check your user ID’;
These two examples show equivalent ways of settingthe SQLSTATE:
RAISE ’Duplicate user ID: %’, user_id USING ERRCODE = ’unique_violation’;
RAISE ’Duplicate user ID: %’, user_id USING ERRCODE = ’23505’;
There is a second
RAISE
syntax in which the main argument is the condition name or SQLSTATE to
be reported, for example:
RAISE division_by_zero;
RAISE SQLSTATE ’22012’;
In this syntax,
USING
can be used to supply a custom error message, detail, or hint. Another way to
do the earlier example is
RAISE unique_violation USING MESSAGE = ’Duplicate user ID: ’ || user_id;
Still another variant is to write
RAISE USING
or
RAISE
level
USING
and put everything else into
the
USING
list.
The last variant of
RAISE
has no parameters at all. This form can onlybe used inside a
BEGIN
block’s
EXCEPTION
clause; it causes the error currently being handled to be re-thrown.
Note: BeforePostgreSQL 9.1,
RAISE
without parameters was interpreted as re-throwingthe error
from the block containing the active exception handler. Thus an
EXCEPTION
clause nested within
that handler could not catchit, even if the
RAISE
was within the nested
EXCEPTION
clause’s block.
This was deemed surprising as well as being incompatible withOracle’s PL/SQL.
If no condition name nor SQLSTATE is specified in a
RAISE EXCEPTION
command, the default is
to use
RAISE_EXCEPTION
(
P0001
). If no message text is specified, the defaultis to use the condition
name or SQLSTATE as message text.
Note: When specifying an error code by SQLSTATE code, you are not limited to the predefined
error codes, but canselect any error code consisting of fivedigits and/or upper-caseASCII letters,
other than
00000
.It is recommendedthat youavoidthrowingerror codes that end in threezeroes,
becausethese are category codes and can only be trapped by trapping the whole category.
40.9. Trigger Procedures
40.9.1. Triggers on Data Changes
PL/pgSQL can be used to define trigger procedures. A trigger procedure is created with the
CREATE
FUNCTION
command, declaring it as a function with no arguments and a return type of
trigger
.
1068
Add image to pdf file acrobat - insert images into PDF in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sample C# code to add image, picture, logo or digital photo into PDF document page using PDF page editor control
add an image to a pdf form; adding image to pdf form
Add image to pdf file acrobat - VB.NET PDF insert image library: insert images into PDF in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Guide VB.NET Programmers How to Add Images in PDF Document
how to add a picture to a pdf document; add photo to pdf form
Chapter 40. PL/pgSQL - SQL Procedural Language
Note that the function must be declared with no arguments even if it expects to receive arguments
specified in
CREATE TRIGGER
—trigger arguments are passed via
TG_ARGV
,as described below.
When a PL/pgSQL function is called as a trigger, several special variables are created automatically
in the top-level block. They are:
NEW
Data type
RECORD
;variable holding the new database row for
INSERT
/
UPDATE
operations in
row-level triggers. This variable is unassigned instatement-level triggers and for
DELETE
opera-
tions.
OLD
Data type
RECORD
;variableholding the old database rowfor
UPDATE
/
DELETE
operations inrow-
leveltriggers. This variable is unassigned in statement-leveltriggers and for
INSERT
operations.
TG_NAME
Data type
name
;variable that contains the name of the trigger actually fired.
TG_WHEN
Data type
text
;a string of
BEFORE
,
AFTER
,or
INSTEAD OF
,depending on the trigger’s defini-
tion.
TG_LEVEL
Data type
text
;a string of either
ROW
or
STATEMENT
depending on the trigger’s definition.
TG_OP
Data type
text
;a stringof
INSERT
,
UPDATE
,
DELETE
,or
TRUNCATE
telling for which operation
the trigger was fired.
TG_RELID
Data type
oid
;the object ID of the table that caused the trigger invocation.
TG_RELNAME
Data type
name
;the nameof the table that caused the trigger invocation. This is nowdeprecated,
andcould disappear in a future release. Use
TG_TABLE_NAME
instead.
TG_TABLE_NAME
Data type
name
;the name of the table that caused the trigger invocation.
TG_TABLE_SCHEMA
Data type
name
;the name of the schema of the table that caused the trigger invocation.
TG_NARGS
Data type
integer
;the number of arguments given to the trigger procedure in the
CREATE
TRIGGER
statement.
TG_ARGV[]
Data type array of
text
;thearguments from the
CREATE TRIGGER
statement. The indexcounts
from 0. Invalidindexes (less than 0 or greater than or equal to
tg_nargs
)result in a null value.
Atrigger function must return either
NULL
or a record/row value having exactly the structure of the
table the trigger was fired for.
1069
.NET PDF Document Viewing, Annotation, Conversion & Processing
Convert image files to PDF. File & Page Process. Add, insert PDF native annotations to PDF file. Edit, update, delete PDF annotations from PDF file. Print.
how to add jpg to pdf file; add photo to pdf for
C# PDF Converter Library SDK to convert PDF to other file formats
professional PDF document conversion library toolkit in C#, you can easily perform file conversion from PDF document to image or document
add jpg to pdf online; add picture to pdf reader
Chapter 40. PL/pgSQL - SQL Procedural Language
Row-level triggers fired
BEFORE
can return null to signal the trigger manager to skip the rest of the
operation for this row (i.e., subsequent triggers are not fired, and the
INSERT
/
UPDATE
/
DELETE
does
not occur for this row). If a nonnull value is returned then the operationproceeds with that rowvalue.
Returning a row value different from the original value of
NEW
alters the row that will be inserted or
updated. Thus, if the trigger function wants the triggering actionto succeed normally without altering
the row value,
NEW
(or a value equal thereto) has to be returned. To alter the row to be stored, it is
possible to replace single values directly in
NEW
and return the modified
NEW
,or to build a complete
new record/row to return. In the case of a before-trigger on
DELETE
,the returned value has no direct
effect, but it has to be nonnull to allow the trigger action to proceed. Note that
NEW
is null in
DELETE
triggers, soreturning that is usuallynot sensible. The usual idiom in
DELETE
triggers is to return
OLD
.
INSTEAD OF
triggers (which are always row-level triggers, and may only be used on views) can
return null to signal that they did not perform any updates, and that the rest of the operation for
this row should be skipped (i.e., subsequent triggers are not fired, and the row is not counted in the
rows-affected status for the surrounding
INSERT
/
UPDATE
/
DELETE
). Otherwisea nonnullvalue should
be returned, to signal that the trigger performed the requested operation. For
INSERT
and
UPDATE
operations, the return valueshould be
NEW
,which the trigger function maymodify tosupport
INSERT
RETURNING
and
UPDATE RETURNING
(this will also affect the row value passed to any subsequent
triggers). For
DELETE
operations, the return value should be
OLD
.
The returnvalue of arow-leveltrigger fired
AFTER
or a statement-leveltrigger fired
BEFORE
or
AFTER
is always ignored; it might as well be null. However, any of these types of triggers might still abort
the entire operation by raising an error.
Example 40-3 shows an example of a trigger procedure in PL/pgSQL.
Example 40-3. A PL/pgSQL Trigger Procedure
This example trigger ensures that any time a row is inserted or updated in the table, the current user
name and time are stamped into the row. And it checks that an employee’s name is given and that the
salary is a positive value.
CREATE TABLE emp (
empname text,
salary integer,
last_date timestamp,
last_user text
);
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
-- Check that empname and salary are given
IF NEW.empname IS NULL THEN
RAISE EXCEPTION ’empname cannot be null’;
END IF;
IF NEW.salary IS NULL THEN
RAISE EXCEPTION ’% cannot have null salary’, NEW.empname;
END IF;
-- Who works for us when she must pay for it?
IF NEW.salary < 0 THEN
RAISE EXCEPTION ’% cannot have a negative salary’, NEW.empname;
END IF;
-- Remember who changed the payroll when
NEW.last_date := current_timestamp;
NEW.last_user := current_user;
1070
C# Windows Viewer - Image and Document Conversion & Rendering in
conversion library toolkit in C#, you can easily perform file conversion from Image and Document Conversion Supported by Windows Viewer. Convert to PDF.
add image to pdf file; adding images to pdf
C# powerpoint - PowerPoint Conversion & Rendering in C#.NET
may easily achieve the following PowerPoint file conversions SDK to convert PowerPoint document to PDF document demo code for PowerPoint to TIFF image conversion
add image to pdf online; add jpeg signature to pdf
Chapter 40. PL/pgSQL - SQL Procedural Language
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Another way to log changes to a table involves creating a new table that holds a row for each insert,
update, or delete that occurs. This approachcan be thought of as auditing changes to a table. Example
40-4 shows an example of an audit trigger procedure in PL/pgSQL.
Example 40-4. A PL/pgSQL Trigger Procedure For Auditing
This example trigger ensures that any insert, update or delete of a row in the
emp
table is recorded
(i.e., audited) in the
emp_audit
table. The current time and user name are stamped into the row,
together with the type of operation performedon it.
CREATE TABLE emp (
empname
text NOT NULL,
salary
integer
);
CREATE TABLE emp_audit(
operation
char(1)
NOT NULL,
stamp
timestamp NOT NULL,
userid
text
NOT NULL,
empname
text
NOT NULL,
salary integer
);
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
--
-- Create a row in emp_audit to reflect the operation performed on emp,
-- make use of the special variable TG_OP to work out the operation.
--
IF (TG_OP = ’DELETE’) THEN
INSERT INTO emp_audit SELECT ’D’, now(), user, OLD.
*
;
RETURN OLD;
ELSIF (TG_OP = ’UPDATE’) THEN
INSERT INTO emp_audit SELECT ’U’, now(), user, NEW.
*
;
RETURN NEW;
ELSIF (TG_OP = ’INSERT’) THEN
INSERT INTO emp_audit SELECT ’I’, now(), user, NEW.
*
;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
Avariation of the previous example uses a view joining the main table to the audit table, to show
when each entry was last modified. This approach still records the full audit trail of changes to the
table, but also presents a simplified view of the audit trail, showing just the last modified timestamp
1071
C# Word - Word Conversion in C#.NET
you may easily achieve the following Word file conversions. XDoc.Word SDK to convert Word document to PDF document C# demo code for Word to TIFF image conversion
add picture to pdf preview; add image to pdf reader
VB.NET PDF: How to Create Watermark on PDF Document within
Using this VB.NET Imaging PDF Watermark Add-on, you can a watermark that consists of text or image (such as And with our PDF Watermark Creator, users need no
how to add image to pdf in acrobat; add signature image to pdf acrobat
Chapter 40. PL/pgSQL - SQL Procedural Language
derived from the audit trail for each entry. Example 40-5 shows an example of an audit trigger on a
view in PL/pgSQL.
Example 40-5. A PL/pgSQL View Trigger Procedure For Auditing
This example uses a trigger on the view to make it updatable, and ensure that any insert, update or
delete of a row in the view is recorded (i.e., audited) in the
emp_audit
table. The current time and
user name are recorded, together with the type of operation performed, and the view displays the last
modified time of each row.
CREATE TABLE emp (
empname
text PRIMARY KEY,
salary
integer
);
CREATE TABLE emp_audit(
operation
char(1)
NOT NULL,
userid
text
NOT NULL,
empname
text
NOT NULL,
salary
integer,
stamp
timestamp NOT NULL
);
CREATE VIEW emp_view AS
SELECT e.empname,
e.salary,
max(ea.stamp) AS last_updated
FROM emp e
LEFT JOIN emp_audit ea ON ea.empname = e.empname
GROUP BY 1, 2;
CREATE OR REPLACE FUNCTION update_emp_view() RETURNS TRIGGER AS $$
BEGIN
--
-- Perform the required operation on emp, and create a row in emp_audit
-- to reflect the change made to emp.
--
IF (TG_OP = ’DELETE’) THEN
DELETE FROM emp WHERE empname = OLD.empname;
IF NOT FOUND THEN RETURN NULL; END IF;
OLD.last_updated = now();
INSERT INTO emp_audit VALUES(’D’, user, OLD.
*
);
RETURN OLD;
ELSIF (TG_OP = ’UPDATE’) THEN
UPDATE emp SET salary = NEW.salary WHERE empname = OLD.empname;
IF NOT FOUND THEN RETURN NULL; END IF;
NEW.last_updated = now();
INSERT INTO emp_audit VALUES(’U’, user, NEW.
*
);
RETURN NEW;
ELSIF (TG_OP = ’INSERT’) THEN
INSERT INTO emp VALUES(NEW.empname, NEW.salary);
NEW.last_updated = now();
INSERT INTO emp_audit VALUES(’I’, user, NEW.
*
);
RETURN NEW;
1072
VB.NET PowerPoint: VB Code to Draw and Create Annotation on PPT
as a kind of compensation for limitations (other documents are compatible, including PDF, TIFF, MS VB.NET PPT: VB Code to Add Embedded Image Object to
adding a jpeg to a pdf; add an image to a pdf with acrobat
BMP to PDF Converter | Convert Bitmap to PDF, Convert PDF to BMP
Also designed to be used add-on for .NET Image Powerful image converter for Bitmap and PDF files; No Support conversion of Bitmap - PDF files in both single &
add a jpg to a pdf; adding images to pdf files
Chapter 40. PL/pgSQL - SQL Procedural Language
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit
INSTEAD OF INSERT OR UPDATE OR DELETE ON emp_view
FOR EACH ROW EXECUTE PROCEDURE update_emp_view();
One use of triggers is to maintain a summary table of another table. The resulting summary can be
used in place of the original table for certain queries — often with vastly reduced run times. This
technique is commonly used in Data Warehousing, where the tables of measured or observed data
(called fact tables) might be extremely large. Example 40-6 shows an example of a trigger procedure
in PL/pgSQL that maintains a summary table for a fact table in a data warehouse.
Example 40-6. A PL/pgSQL Trigger Procedure For Maintaining A Summary Table
The schema detailed here is partly based on the Grocery Store example from The Data Warehouse
Toolkit by Ralph Kimball.
--
-- Main tables - time dimension and sales fact.
--
CREATE TABLE time_dimension (
time_key
integer NOT NULL,
day_of_week
integer NOT NULL,
day_of_month
integer NOT NULL,
month
integer NOT NULL,
quarter
integer NOT NULL,
year
integer NOT NULL
);
CREATE UNIQUE INDEX time_dimension_key ON time_dimension(time_key);
CREATE TABLE sales_fact (
time_key
integer NOT NULL,
product_key
integer NOT NULL,
store_key
integer NOT NULL,
amount_sold
numeric(12,2) NOT NULL,
units_sold
integer NOT NULL,
amount_cost
numeric(12,2) NOT NULL
);
CREATE INDEX sales_fact_time ON sales_fact(time_key);
--
-- Summary table - sales by time.
--
CREATE TABLE sales_summary_bytime (
time_key
integer NOT NULL,
amount_sold
numeric(15,2) NOT NULL,
units_sold
numeric(12) NOT NULL,
amount_cost
numeric(15,2) NOT NULL
);
CREATE UNIQUE INDEX sales_summary_bytime_key ON sales_summary_bytime(time_key);
--
-- Function and trigger to amend summarized column(s) on UPDATE, INSERT, DELETE.
--
CREATE OR REPLACE FUNCTION maint_sales_summary_bytime() RETURNS TRIGGER
1073
PDF to WORD Converter | Convert PDF to Word, Convert Word to PDF
If you want to convert document file PDF formats to out transformation between different kinds of image files and Converter has accurate output, and PDF to Word
add picture to pdf form; add picture to pdf document
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
No need for Adobe Acrobat Reader; Seamlessly integrated into RasterEdge .NET Image SDK; high speed; Get a compressed PDF file after conversion;
pdf insert image; add jpeg to pdf
Chapter 40. PL/pgSQL - SQL Procedural Language
AS $maint_sales_summary_bytime$
DECLARE
delta_time_key
integer;
delta_amount_sold
numeric(15,2);
delta_units_sold
numeric(12);
delta_amount_cost
numeric(15,2);
BEGIN
-- Work out the increment/decrement amount(s).
IF (TG_OP = ’DELETE’) THEN
delta_time_key = OLD.time_key;
delta_amount_sold = -1
*
OLD.amount_sold;
delta_units_sold = -1
*
OLD.units_sold;
delta_amount_cost = -1
*
OLD.amount_cost;
ELSIF (TG_OP = ’UPDATE’) THEN
-- forbid updates that change the time_key -
-- (probably not too onerous, as DELETE + INSERT is how most
-- changes will be made).
IF ( OLD.time_key != NEW.time_key) THEN
RAISE EXCEPTION ’Update of time_key : % -> % not allowed’,
OLD.time_key, NEW.time_key;
END IF;
delta_time_key = OLD.time_key;
delta_amount_sold = NEW.amount_sold - OLD.amount_sold;
delta_units_sold = NEW.units_sold - OLD.units_sold;
delta_amount_cost = NEW.amount_cost - OLD.amount_cost;
ELSIF (TG_OP = ’INSERT’) THEN
delta_time_key = NEW.time_key;
delta_amount_sold = NEW.amount_sold;
delta_units_sold = NEW.units_sold;
delta_amount_cost = NEW.amount_cost;
END IF;
-- Insert or update the summary row with the new values.
<<insert_update>>
LOOP
UPDATE sales_summary_bytime
SET amount_sold = amount_sold + delta_amount_sold,
units_sold = units_sold + delta_units_sold,
amount_cost = amount_cost + delta_amount_cost
WHERE time_key = delta_time_key;
EXIT insert_update WHEN found;
BEGIN
INSERT INTO sales_summary_bytime (
time_key,
amount_sold,
units_sold,
1074
Chapter 40. PL/pgSQL - SQL Procedural Language
amount_cost)
VALUES (
delta_time_key,
delta_amount_sold,
delta_units_sold,
delta_amount_cost
);
EXIT insert_update;
EXCEPTION
WHEN UNIQUE_VIOLATION THEN
-- do nothing
END;
END LOOP insert_update;
RETURN NULL;
END;
$maint_sales_summary_bytime$ LANGUAGE plpgsql;
CREATE TRIGGER maint_sales_summary_bytime
AFTER INSERT OR UPDATE OR DELETE ON sales_fact
FOR EACH ROW EXECUTE PROCEDURE maint_sales_summary_bytime();
INSERT INTO sales_fact VALUES(1,1,1,10,3,15);
INSERT INTO sales_fact VALUES(1,2,1,20,5,35);
INSERT INTO sales_fact VALUES(2,2,1,40,15,135);
INSERT INTO sales_fact VALUES(2,3,1,10,1,13);
SELECT
*
FROM sales_summary_bytime;
DELETE FROM sales_fact WHERE product_key = 1;
SELECT
*
FROM sales_summary_bytime;
UPDATE sales_fact SET units_sold = units_sold
*
2;
SELECT
*
FROM sales_summary_bytime;
40.9.2. Triggers on Events
PL/pgSQL can be used to define event triggers. PostgreSQL requires that a procedure that is to be
called as an event trigger must be declared as a function with no arguments and a return type of
event_trigger
.
When a PL/pgSQL function is called as a event trigger, several special variables are created automat-
ically in the top-level block. They are:
TG_EVENT
Data type
text
;a string representing the event the trigger is fired for.
TG_TAG
Data type
text
;variable that contains the command tag for which the trigger is fired.
Example 40-7 shows an example of a event trigger procedure in PL/pgSQL.
1075
Chapter 40. PL/pgSQL - SQL Procedural Language
Example 40-7. A PL/pgSQL Event Trigger Procedure
This example trigger simply raises a
NOTICE
message each time a supported command is executed.
CREATE OR REPLACE FUNCTION snitch() RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE ’snitch: % %’, tg_event, tg_tag;
END;
$$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER snitch ON ddl_command_start EXECUTE PROCEDURE snitch();
40.10. PL/pgSQL Under the Hood
This section discusses some implementation details thatarefrequently important for PL/pgSQL users
to know.
40.10.1. Variable Substitution
SQL statements and expressions withina PL/pgSQL functioncan refer to variables and parameters of
the function. Behindthe scenes, PL/pgSQL substitutes queryparameters for suchreferences. Parame-
ters willonly be substitutedin places where a parameter or columnreference is syntactically allowed.
As an extreme case, consider this example of poor programming style:
INSERT INTO foo (foo) VALUES (foo);
The first occurrence of
foo
must syntactically be a table name, so it will not be substituted, even if
the function has a variable named
foo
.The second occurrence must be the name of a column of the
table, so it will not be substituted either. Only the third occurrence is a candidate to be a reference to
the function’s variable.
Note: PostgreSQL versions before 9.0 would try to substitute the variable in all three cases,
leading to syntax errors.
Since the names of variables are syntactically no differentfrom the names of table columns, there can
be ambiguity in statements that also refer to tables: is a given name meant to refer to a table column,
or a variable? Let’s change the previous example to
INSERT INTO dest (col) SELECT foo + bar FROM src;
Here,
dest
and
src
mustbe tablenames, and
col
must be a column of
dest
,but
foo
and
bar
might
reasonably be either variables of the function or columns of
src
.
By default, PL/pgSQL willreport anerror if a name ina SQL statement could refer to either a variable
or a table column. You can fix such a problem by renaming the variable or column, or by qualifying
the ambiguous reference, or by telling PL/pgSQL which interpretation to prefer.
The simplest solutionis to rename the variable or column. A common coding rule is to use a different
naming convention for PL/pgSQL variables than you use for column names. For example, if you
consistently name function variables
v_
something
while none of your column names start with
v_
,
no conflicts will occur.
1076
Chapter 40. PL/pgSQL - SQL Procedural Language
Alternatively you can qualify ambiguous references to make them clear. In the above example,
src.foo
would be an unambiguous reference to the table column. To create an unambiguous
reference to a variable, declare it in a labeled block and use the block’s label (see Section 40.2). For
example,
<<block>>
DECLARE
foo int;
BEGIN
foo := ...;
INSERT INTO dest (col) SELECT block.foo + bar FROM src;
Here
block.foo
means the variable even if there is a column
foo
in
src
.Function parameters, as
well as special variables such as
FOUND
,can be qualified by the function’s name, because they are
implicitly declared in an outer block labeled with the function’s name.
Sometimes it is impractical to fix all the ambiguous references in a large body of PL/pgSQL code. In
suchcases youcanspecifythatPL/pgSQL shouldresolve ambiguous references asthevariable(which
is compatible with PL/pgSQL’s behavior before PostgreSQL 9.0), or as the table column (which is
compatible with some other systems such as Oracle).
To change this behavior on a system-wide basis, set the configuration parameter
plpgsql.variable_conflict
to one of
error
,
use_variable
,or
use_column
(where
error
is the factory default). This parameter affects subsequent compilations of statements in PL/pgSQL
functions, but not statements already compiled in the current session. Because changing this setting
can cause unexpected changes in the behavior of PL/pgSQL functions, it can only be changed by a
superuser.
You can also set the behavior on a function-by-function basis, by inserting one of these special com-
mands at the start of the function text:
#variable_conflict error
#variable_conflict use_variable
#variable_conflict use_column
These commands affect only the function they are written in, and override the setting of
plpgsql.variable_conflict
.An example is
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
#variable_conflict use_variable
DECLARE
curtime timestamp := now();
BEGIN
UPDATE users SET last_modified = curtime, comment = comment
WHERE users.id = id;
END;
$$ LANGUAGE plpgsql;
Inthe
UPDATE
command,
curtime
,
comment
,and
id
willrefer to the function’s variable andparam-
eters whether or not
users
has columns of those names. Notice that we had to qualify the reference
to
users.id
in the
WHERE
clause to make it refer to the table column. But we did not have toqualify
the reference to
comment
as a target in the
UPDATE
list, because syntactically that must be a column
of
users
.We could write the same function withoutdepending on the
variable_conflict
setting
in this way:
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
<<fn>>
1077
Documents you may be interested
Documents you may be interested