sql >> Databasteknik >  >> RDS >> PostgreSQL

Oracle DBMS_LOB.WRITEAPPEND till Postgres-konvertering

Det beror på storleken på ditt stora föremål. När dina stora objekt är mindre än 500 MB behöver du inte använda LOB (PostgreSQL använder termen LO), och du kan använda en text eller varchar typ - arbetet är liknande som med varchar . Efter denna storlek bör du använda LO API.

CREATE OR REPLACE FUNCTION writeappend(oid, text)
RETURNS void AS $$
DECLARE
  content bytea;
  fd int;
BEGIN
  content := convert_to($2, getdatabaseencoding());
  fd := lo_open($1, 131072);
  PERFORM lo_lseek(fd, 0, 2);
  IF length(content) <> lowrite(fd, content) THEN
    RAISE EXCEPTION 'not all content was written';
  END IF;
  PERFORM lo_close(fd);
END;
$$ LANGUAGE plpgsql;

postgres=> select lo_creat(-1);
┌──────────┐
│ lo_creat │
╞══════════╡
│    20653 │
└──────────┘
(1 row)

postgres=> select writeappend(20653, e'Hello\r\n');
┌─────────────┐
│ writeappend │
╞═════════════╡
│             │
└─────────────┘
(1 row)

postgres=> select writeappend(20653, e'Hello\r\n');
...

postgres=> select convert_from(lo_get(20653),getdatabaseencoding());
┌──────────────┐
│ convert_from │
╞══════════════╡
│ Hello\r     ↵│
│ Hello\r     ↵│
│              │
└──────────────┘
(1 row)

Så du kan använda LO API, men grundläggande typer bör föredras. Gränserna för dessa typer är vanligtvis tillräckligt bra - och arbete med bastyper är mycket bekvämare - med vissa möjligheter som fulltext.




  1. ORA-03113:slutet av filen på kommunikationskanalen efter lång inaktivitet i ASP.Net-appen

  2. Rätt sätt att få användarnamn och lösenord från anslutningssträngen?

  3. Sökfråga för flera taggar

  4. Hur gör man samma aggregering på varje kolumn, utan att lista kolumnerna?