| PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
���ú�����ʱ�������������д���Բ���Ŀǰ��"�汾 1"�ı������Խӿڣ�������û�����Ĺ�������д�ĺ����� �� SQL д�ĺ������Լ��ð汾 0 �ı������Խӿ�д�ĺ�����������ͨ��һ�� ���þ�������������ԡ� ���þ����������һ��������ķ���ִ���������������˵�������ṩ���ı��ȵȡ����¼�������дһ���µĹ������Ե��þ����
�������Եĵ��þ����һ��"��ͨ"�ĺ����� ����ʹ��һ�ֱ���������д������ C��ʹ�ð汾-1�Ľӿڣ������� PostgreSQL ��ע��ɽ�������������ҷ������� language_handler�� ��������α���ͱ�ʶ�ú���Ϊһ�����þ�����ұ�����ֱ���� SQL �����б����á�
���þ���ĵ��÷�ʽ����������һ����������һ��ָ��һ�� FunctionCallInfoData struct ��ָ�룬���ָ���������ֵ���йر����õĺ�������Ϣ�� ����Ԥ��������һ�� Datum ����������ϣ������һ�� SQL �Ŀս���� ��ô�������� isnull �ֶΣ��� ���þ������ͨ�ı��������������� FunctionCallInfoData �ṹ�� flinfo->fn_oid �ֶ�ǿ����ʵ��Ҫ���õĺ����� OID�� �����ǵ��þ���������þ������ʹ������ֶ��ж�Ҫִ���ĸ������� ͨ�������ݽ����IJ����б�Ҳ�ǰ���Ŀ�꺯�����������õģ������Ǹ����þ�����õġ�
��ϵͳ�� pg_proc ��ץȡ��������Լ��������������IJ����ͷ������;��ǵ��þ�������ˡ� ���� CREATE FUNCTION �����е� AS �Ӿ佫���� pg_proc �е� prosrc �ֶ����ҵ������ͨ���ǹ������Ա����Դ�ı�����Ҳ�����DZ�Ķ���������һ��ָ��ij���ļ���·������ �����κθ��ߵ��þ�������ϸ����Ķ�����
ͨ����ÿ�� SQL ����������Ҫ����ͬһ��������Ρ� ���þ���������� flinfo->fn_extra �ֶα����ظ��ز����йر�����������Ϣ�� ����ֶγ�ʼΪ NULL�����ǿ��Ա����þ������Ϊָ���йر�����������Ϣ�� �����ĵ����У���� flinfo->fn_extra �Ѿ�Ϊ��NULL����ô�Ϳ���ֱ��ʹ�������������²�����Ϣ�� ���þ������ȷ�� flinfo->fn_extra ������ָ��һ�����ٻ����浽��ǰ��ѯ�������ڴ���� ��Ϊһ�� FmgrInfo ���ݽṹ���ᱣ����ô����ʱ�䡣 һ��ʵ�����Ҫ��ķ������� flinfo->fn_mcxt �������ڴ滷�������һ���������ݣ� ����������ͨ���� FmgrInfo �Լ���һ���������ڡ� ���Ǿ��Ҳ����ͬ��ѡ��ʹ��һ�����������ڵĻ������������Ϳ��Կ��ѯ���溯�����塣
�ڹ������Ժ����Դ���������ʽ���õ�ʱ��û��ʲô������ͨ���ķ�ʽ���ݽ����� ���� FunctionCallInfoData �� context �ֶ�ָ��һ�� TriggerData �ṹ�� ����������ͨ������������� NULL ������һ�����Ծ��Ӧ��Ϊ�������Ժ����ṩ��ȡ��������Ϣ�Ļ��ơ�
������һ���� C д����Զ�������Ծ����ģ�棺
#include "postgres.h"
#include "executor/spi.h"
#include "commands/trigger.h"
#include "fmgr.h"
#include "access/heapam.h"
#include "utils/syscache.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"
PG_FUNCTION_INFO_V1(plsample_call_handler);
Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
Datum retval;
if (CALLED_AS_TRIGGER(fcinfo))
{
/*
* �Դ��������̵���
*/
TriggerData *trigdata = (TriggerData *) fcinfo->context;
retval = ...
}
else
{
/*
* �Ժ�������
*/
retval = ...
}
return retval;
}�ڴ��ĵط����ϼ�ǧ�д���Ϳ�����ɵ��þ����
�ڰѾ�����������һ����װ�ص�ģ�飨���� Section 31.9.6��֮�� ���������Ϳ���ע��������ӹ������ԣ�
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS 'filename'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
�������д�Լ��ĵ��þ������ô�����ڱ���������Ĺ��������Ǻܺõ����ӡ� �ο�һ��Դ�������е� src/pl ��Ŀ¼��