PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Status SQL:kesalahan sintaks 42601 pada atau dekat 11

Coba formulir yang sangat disederhanakan ini:

CREATE OR REPLACE FUNCTION somefunc()
  RETURNS void AS
$func$
DECLARE
 addresstablename text := 'address_history_' || to_char(now(), 'FMDD_MM_YYYY');

BEGIN
 EXECUTE 
 'CREATE TABLE ' || addresstablename || '() INHERITS (address_all)';

 EXECUTE
 'INSERT INTO ' || addresstablename || '
  SELECT *
  FROM   address_history
  WHERE  address_timestamp >= $1'
 USING date_trunc('hour', now() - interval '7 days');

END
$func$ LANGUAGE plpgsql;

Poin utama:

  • Anda dapat menetapkan variabel dalam plpgsql pada waktu deklarasi. Menyederhanakan kode.

  • Gunakan to_char() untuk memformat tanggal Anda. Jauh lebih sederhana.

  • now() dan CURRENT_TIMESTAMP lakukan hal yang sama.

  • Jangan mengutip 'now()' , gunakan now() (tanpa tanda kutip) jika Anda menginginkan stempel waktu saat ini.

  • Gunakan USING klausa dengan EXECUTE , jadi Anda tidak perlu mengonversi timestamp ke text dan kembali - mungkin mengalami mengutip masalah seperti yang Anda lakukan. Lebih cepat, lebih sederhana, lebih aman.

  • Dalam LANGUAGE plpgsql , plpgsql adalah kata kunci dan tidak boleh dikutip.

  • Anda mungkin ingin memeriksa apakah tabel sudah ada dengan CREATE TABLE IF NOT EXISTS , tersedia sejak PostgreSQL 9.1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memulai Dengan PostgreSQL 11 di Ubuntu 18.04

  2. Gandakan (ulangi) baris dalam hasil kueri sql

  3. masalah koneksi pgAdmin3

  4. Bisakah saya memotong tabel secara dinamis?

  5. Kesalahan ketidakcocokan data Laravel saat menggunakan \PDO::ATTR_EMULATE_PREPARES => true