35.6. �������

�����Լ�����һ��������������� PL/pgSQL ��ȷ��������������͡��κ��޷�ʶ��Ϊ�������͵���佫����Ϊ SQL ����������ұ����͵������ݿ�����ִ�У��ڽ�������õ����κ� PL/pgSQL ���������滻֮�󣩡���ˣ� ������˵��SQL INSERT��UPDATE���� DELETE ������ܱ���Ϊ�� PL/pgSQL ��䣬�������Dz�δ�ڴ���ȷ�г���

35.6.1. ��ֵ

��һ����������/��¼��ֵ�����淽����

identIFier := expression;

��������������������еı��ʽ����һ�����͵������ݿ������ SQL SELECT �������ġ��ñ��ʽ�������ɵ�һ����ֵ��

������ʽ�Ľ���������ͺͱ����������Ͳ�һ�£� ���߱���������֪�ijߴ�/���ȣ��� char(20)���� ���ֵ�������ر�PL/pgSQL�������ý�����͵���������ͱ������͵����뺯��ת���� Ҫע����ǣ���������ֵ���ִ���ʽ�������뺯�����Խ��ܵ���ʽ�� ��ô���������ܵ����������뺯������������ʱ����

���ӡ�

user_id := 20;
tax := subtotal * 0.06;

35.6.2. SELECT INTO

���ɶ���У���ֻ��һ�У���SELECT����Ľ�����Ը���һ����¼������ �����ͱ���������һ�������������б����������淽��ʵ�ֵģ�

SELECT INTO target select_expressions FROM ...;

����� target ������һ����¼������ �б���������һ���ö��ŷָ��ļ򵥱����ͼ�¼/���ֶε��б� select_expressions �������ʣ�ಿ�ֺ���ͨ SQL һ����

��ע���������� PostgreSQL ��ͨ��SELECT INTO����Ľ����Dz�һ���ģ� ���ߵ�INTOĿ����һ���´����ı� ����������� PL/pgSQL �������һ��SELECT �Ľ���д���һ������ôʹ�� CREATE TABLE ... AS SELECT �﷨����

�����һ�л���һ�������б�����Ŀ�꣬��ôѡ������ֵ���辫ȷƥ��Ŀ��Ľṹ�� ����ͻ��������ʱ�������Ŀ����һ����¼��������ô���Զ����Լ����ó��������е������͡�

����INTO�Ӿ䣬ʣ�µ�SELECT������ͨ�� SQL SELECT������ȫһ���� ���������ʹ��SELECT��ȫ��������

INTO �Ӿ伸�����Գ����� SELECT �����κεط��� ϰ�������Ǹ��� SELECT ���棬��������д�������� ���߾��� FROM ֮ǰ — Ҳ����˵���� select_expressions �б�֮ǰ����֮��

�����������У����Ŀ�긳���ֵ�� �������ض��У���ô����һ�и���Ŀ�겢�����������С� ����ע�⣺����������ORDER BY������"��һ��"�Dz���ȷ�ġ���

INTO�Ӿ���Գ�����SELECT������ļ����κεط���

��һ�� SELECT INTO ���֮������Լ��������� FOUND ������ Section 35.6.5�����ж�һ����ֵ�Ƿ�ɹ��� Ҳ����˵����ѯ���ٷ���һ�С����磺

SELECT INTO myrec * FROM emp WHERE empname = myname;
IF NOT FOUND THEN
    RAISE EXCEPTION 'employee % not found', myname;
END IF;

Ҫ����һ����¼/�н���Ƿ�Ϊ�գ������ʹ�� IS NULL ���������������ʱ��û���κΰ취���ж��Ƿ��ж�����б�������������һ�����ӣ�����û�з����е������

DECLARE
    users_rec RECORD;
BEGIN
    SELECT INTO users_rec * FROM users WHERE user_id=3;

    IF users_rec.homepage IS NULL THEN
        -- �û�û��������ҳ������"http://"
        RETURN 'http://';
    END IF;
END;

35.6.3. ִ��һ��û�н���ı��ʽ��������

��ʱ������ϣ������һ�����ʽ����һ���������ȴ����������ͨ����Ϊ���Ǿ�������һЩ�������õĸ����õ��Dz��������ý��ֵ�ĺ������� Ҫ�� PL/pgSQL �������£� �����ʹ��PERFORM��䣺

PERFORM query;

�������ִ��һ�� query���Ҷ�������� query ��д������ƽ��д SQL SELECT ������һ���ģ� ֻ�ǰѿ�ͷ�Ĺؼ��� SELECT �滻�� PERFORM�� PL/pgSQL �ı�����ƽ��һ�������������С� ͬ�������������������һ�У���ô����ı��� FOUND ����Ϊ�棬���û�������У���Ϊ�١�

ע��: ���ǿ���ϣ��û��INTO�Ӿ��SELECTҲ��������������Ҫ�� ����Ŀǰ���Խ��ܵ�Ψһ�ķ�����PERFORM��

һ�����ӣ�

PERFORM create_mv('cs_session_page_requests_mv', my_query);

35.6.4. ִ�ж�̬����

�㾭����ϣ�������PL/pgSQL���������ɶ�̬��� Ҳ������Щÿ��ִ�е�ʱ�򶼻��漰��ͬ���ͬ�������͵���� ������������£�PL/pgSQL ��ͼΪ�����ִ�мƻ���һ����ͼ�����ٺ��ʡ� Ϊ�˴������������⣬�����ṩ�� EXECUTE ��䣺

EXECUTE command-string;

����� command-string ��һ�������ִ�������Ϊ text���ı��ʽ�����ִ�����Ҫִ�е���� ���ִ����ı��������ݸ� SQL ���档

���ر�ע���ڸ������ִ��ォ���ᷢ���κ� PL/pgSQL ���������� ��������ֵ�����ڹ��������ִ���ʱ�������ִ���

������������PL/pgSQL������ͬ�� һ����EXECUTE������е������ڷ������������ڲ���ֻ׼���ͱ���һ�Ρ� �෴���ڸ����ÿ�����е�ʱ�����׼��һ�Ρ� �����ִ������ڹ����ﶯ̬�������Ա��ڶԸ��ֲ�ͬ�ı���ֶν��в�����

����SELECT����Ľ����EXECUTE����������ĿǰEXECUTE ���滹��֧��SELECT INTO����������û�а취��һ����̬������ SELECT �У� ʹ�ü򵥵� EXECUTE �����ȡ����� �������������ַ�������ʵ�����ȡ�����һ������ʹ���� Section 35.7.4 ��������FOR-IN-EXECUTE��ʽ�� ����һ���Ǻ� OPEN-FOR-EXECUTE һ�����α꣬���� Section 35.8.2 ��������������

��ʹ�ö�̬�����ʱ���㾭����Ҫ���ݵ����š����ǽ����Χ��ĺ������ڹ̶��ı��ķ�������Ԫ����Χ�� ����������ϵģ�û��ʹ����Ԫ����Χ�Ĵ��룬��ο� Section 35.2.1�� �����ڰ��ϴ���ת���ɸ�����Ľṹʱ�����ʡ���һЩ��������

Ҫ���뵽��������IJ�ѯ�еĶ�̬��ֵҲ��Ҫ����Ĵ��� ��Ϊ�����Լ����ܰ��������ַ��� һ�����ӣ������ر�˵��֮�⣬�������Ƕ�������ʹ������Ԫ����Χ����

EXECUTE 'UPDATE tbl SET '
        || quote_ident(columnname)
        || ' = '
        || quote_literal(newvalue)
        || ' WHERE ...';

���������ʾ�˺��� quote_ident(text) �� quote_literal(text) ��ʹ�á� Ϊ�˰�ȫ�������ֶκͱ��ʶ���ı���Ӧ�ô��ݸ����� quote_ident�� ��Щ������ֵ�ı����������ֵ�ڹ������̬�����ִ���Ӧ�����ı��ִ�����ôӦ�ô��ݸ� quote_literal�� �����������ȡ���ʵIJ���������ı���Χ�ڵ���˫�����ﲢ�Ҷ��κ�Ƕ�����е������ַ����к��ʵ����ݴ���

��ע����Ԫ����Χֻ�԰�Χ�̶��ı����á��������������������������ӣ��Ǿ�̫�����

EXECUTE 'UPDATE tbl SET '
        || quote_ident(colname)
        || ' = $$'
        || newvalue
        || '$$ WHERE ...';

��Ϊ��� newvalue ������������$$����ô��δ������ë���ˡ� ͬ����������ܳ�������ѡ�õ��κ���Ԫ����Χ�ָ����ϡ� ��ˣ�Ҫ�밲ȫ�ذ�Χ���Ȳ�֪�����ı���������ʹ�� quote_literal��

��̬����� EXECUTE ��һ������������� Example 35-5 � �������������ִ����һ�������µĺ����� CREATE FUNCTION ���

35.6.5. ��ȡ���״̬

�кü��ַ��������ж�һ�������Ч������һ��������ʹ�� GET DIAGNOSTICS��������ʽ���£�

GET DIAGNOSTICS variable = item [ , ... ] ;

���������������Ǽ���ϵͳ״̬��ʶ����ÿ�� item ��һ���ؼ��֣���ʾһ����Ҫ������ض�������״ֵ̬���ñ���Ӧ�ú�Ҫ���յ���ֵ������ͬ���� ��ǰ���õ�״̬���� ROW_COUNT�� ���һ�����͸� SQL ����� SQL �������е��������� RESULT_OID�����һ�� SQL �����������һ�е� OID����ע�� RESULT_OID ֻ����һ��INSERT����֮������á�

һ�����ӣ�

      GET DIAGNOSTICS var_integer = ROW_COUNT;

����һ���ж�����Ч���ķ�����һ������Ϊ boolean ��������� FOUND�� FOUND��ÿ�� PL/pgSQL �����↑ʼ��Ϊ�١���������������ã�

FOUND ��ÿ�� PL/pgSQL ��ľֲ������� �����κ��޸�ֻӰ�쵱ǰ�ĺ�����