PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 36. PL/Tcl - Tcl �������� | Fast Forward | Next |
�� PL/Tcl �������������������������ڴӷ������ݿ⣺
ִ��һ�����ִ���ʽ������ SQL ��ѯ����ѯ�еĴ���ᵼ���׳�һ������ ����spi_exec �ķ���ֵ��������������ѡ�������룬���£�����ɾ������ �����������һ��������������㡣���⣬�����ѯ��һ��SELECT ��䣬��ôѡ�����ֶΰ������������ķ������� Tcl �����С�
��ѡ�� -count ֵ���� spi_exec �ڸò�ѯ�д����������������Ч���ͰѲ�ѯ����Ϊһ���α꣬ Ȼ��˵ FETCH n ��һ���ġ�
�����ѯ��һ��SELECT��䣬��ôSELECT�Ľ���е���ֵ�������ø��ֶ��������� Tcl �����С� ��������� -array ѡ���ô�ֶ�ֵ���ŵ������������������У��ֶ�����������������
�����ѯ��SELECT��䲢��û�и��� loop-body �ű��� ��ôֻ�н����ͷһ�л�洢�� Tcl �����У�������������еĻ��� ���ᱻ���ԡ������ѯû�з����κ��У� ��ô����洢ʲô���ݣ�����������ͨ����� spi_exec �Ľ�����жϣ��� ���磬
spi_exec "SELECT count(*) AS cnt FROM pg_proc"
������ Tcl ���� $cnt Ϊϵͳ��pg_proc�е�������
��������˿�ѡ�� loop-body ������ ��ô������һС�� Tcl �ű�������Ϊ SELECT ����е�ÿһ��ִ��һ�� ��ע�⣺��������IJ�ѯ���� SELECT����ô���� loop-body���� ��ÿ�ε���֮ǰ����ǰ�е��ֶε���ֵ���洢�� Tcl ������ȥ�ˡ����磬
spi_exec -array C "SELECT * FROM pg_class" { elog DEBUG "have table $C(relname)" }
��Ϊ pg_class ��ÿһ�д�ӡһ����־��Ϣ�� ������Ժ����� Tcl ѭ�������������ʽ���ƣ��ر��� continue �� break ��ѭ�����е����ú�ƽ����һ���ġ�
���һ����ѯ�����ij���ֶ��� NULL����ô��Ŀ��������� "unset" ������������ʲô������
Ϊ�����ִ����������һ����ѯ�滮������Ĺ滮�������ھ��ǵ�ǰ�Ự�������ڡ�
��ѯ����ʹ�ò�������Щ�����ǹ滮ʵ��ִ�е�ʱ���ṩ����ֵ��ռλ���� �ڲ�ѯ�ִ����÷��� $1 ... $n ���ø��������������ѯʹ���˲�������ô����������������һ�� Tcl �б����ʽ������ �����û��ʹ�ò�������ô�� typelist дһ�����б��� Ŀǰ���������ͱ���� pg_type ����ʾ���ڲ�������һ���� ������int4 ������ integer��
spi_prepare �ķ���ֵ��һ������������ spi_execp ������ʹ�õIJ�ѯ ID������ spi_execp ��ȡ���ӡ�
ִ��һ��ǰ���� spi_prepare ���IJ�ѯ�� queryid �� spi_prepare ���ص� ID������ò�ѯ�����˲�������ô���DZ����ṩһ�� value-list������һ�� Tcl �б����������Щ������ʵ����ֵ�� ����б�ij��ȱ����ǰ��� spi_prepare �ṩ�IJ��������б�ij���һ������ �����ѯû�в�������ôʡ�� value-list��
-nulls ��ѡ����ֵ��һ���հ��ִ����ַ� 'n'�� ���� spi_execp ��Щ������ NULL����������� ��ô������� value-list �ij�����ͬ�� ���û�и�������ô���в���ֵ���Ƿ� NULL��
���˲�ѯ������������ķ�ʽ֮�⣬spi_execp ��ʹ�÷��������Ϻ� spi_exec һ���� -count��-array���� loop-body ѡ���һ���ģ������ֵҲһ����
������һ��ʹ�����õĹ滮�� PL/Tcl ���������ӣ�
CREATE FUNCTION t1_count(integer, integer) RETURNS integer AS $$ if {![ info exists GD(plan) ]} { # prepare the saved plan on the first call set GD(plan) [ spi_prepare \ "SELECT count(*) AS cnt FROM t1 WHERE num >= \$1 AND num <= \$2" \ [ list int4 int4 ] ] } spi_execp -count 1 $GD(plan) [ list $1 $2 ] return $cnt $$ LANGUAGE pltcl;
������Ҫ�ڸ� spi_prepare �IJ�ѯ�ִ���ŷ�б�ܣ� ��ȷ�� $n ��ǻ�ԭ�����ݸ� spi_prepare�� �����DZ� Tcl �ı��������滻����
����ò�ѯ�ǵ���INSERT�� �������� spi_exec ���� spi_execp ��ѯ������е� OID����������ǣ����յ��㡣��
�ڸ������ִ��ォ���ɵ����źͷ�б���ַ����Ƴ�˫�ݡ� ���������ڰ�ȫ�ش�����ЩҪ���뵽 spi_exec ���� spi_prepare �е� SQL �����е����Ű�Χ�ִ��� ���磬����һ�� SQL �������������
"SELECT '$val' AS ret"
����� Tcl ����valʵ���ϰ��� doesn't�� �������������ִ���������
SELECT $q$doesn't$q$ AS ret
������ִ��� spi_exec �� spi_prepare ��ʱ��ᵼ��һ���������� Ϊ���ܹ����������ύ������Ӧ�ð���
SELECT 'doesn''t' AS ret
������ PL/Tcl �����������
"SELECT '[ quote $val ]' AS ret"
spi_execp ��һ���ŵ����㲻��Ҫ���������Ű�Χ����ֵ�� ��Ϊ���������ᵱ�� SQL ��ѯ�ִ���һ���ֱ�������
����һ����־���ߴ�����Ϣ�����ܵļ����� DEBUG�� LOG��INFO�� NOTICE��WARNING�� ERROR���� FATAL�� ERROR �׳�һ��������������������һ����ִ�н���ֹ�� ͬʱ�˳���ǰ���� FATAL �˳���ǰ�����ҵ��µ�ǰ�Ự�رգ������� PL/Tcl ������û��ʲô����ʹ��������� �ṩ����Ҫ��Ϊ���������� ij�����ȼ������Ϣ�DZ�����ͻ��˻���д����������־�� ���������������� log_min_messages �� client_min_messages ���ñ������Ƶġ� ���� Section 16.4 ��ȡ����ϸ�ڡ�