36.5. �� PL/Tcl ����������ݿ�

�� PL/Tcl �������������������������ڴӷ������ݿ⣺

spi_exec ?-count n? ?-array name? command ?loop-body?

ִ��һ�����ִ���ʽ������ 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" ������������ʲô������

spi_prepare query typelist

Ϊ�����ִ��׼��������һ����ѯ�滮������Ĺ滮�������ھ��ǵ�ǰ�Ự�������ڡ�

��ѯ����ʹ�ò�������Щ�����ǹ滮ʵ��ִ�е�ʱ���ṩ����ֵ��ռλ���� �ڲ�ѯ�ִ����÷��� $1 ... $n ���ø��������������ѯʹ���˲�������ô����������������һ�� Tcl �б����ʽ������ �����û��ʹ�ò�������ô�� typelist дһ�����б��� Ŀǰ���������ͱ���� pg_type ����ʾ���ڲ�������һ���� ������int4 ������ integer��

spi_prepare �ķ���ֵ��һ������������ spi_execp ������ʹ�õIJ�ѯ ID������ spi_execp ��ȡ���ӡ�

spi_execp ?-count n? ?-array name? ?-nulls string? queryid ?value-list? ?loop-body?

ִ��һ��ǰ���� 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 �ı��������滻����

spi_lastoid

����ò�ѯ�ǵ���INSERT�� �������� spi_exec ���� spi_execp ��ѯ������е� OID����������ǣ����յ��㡣��

quote string

�ڸ������ִ��ォ���ɵ����źͷ�б���ַ����Ƴ�˫�ݡ� ���������ڰ�ȫ�ش�����ЩҪ���뵽 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 ��ѯ�ִ���һ���ֱ�������

elog level msg

����һ����־���ߴ�����Ϣ�����ܵļ����� DEBUG�� LOG��INFO�� NOTICE��WARNING�� ERROR���� FATAL�� ERROR �׳�һ��������������������һ����ִ�н���ֹ�� ͬʱ�˳���ǰ���� FATAL �˳���ǰ�����ҵ��µ�ǰ�Ự�رգ������� PL/Tcl ������û��ʲô����ʹ��������󼶱� �ṩ����Ҫ��Ϊ���������� ij�����ȼ������Ϣ�DZ�����ͻ��˻���д����������־�� ���������������� log_min_messages �� client_min_messages ���ñ������Ƶġ� ���� Section 16.4 ��ȡ����ϸ�ڡ�