2017-12-02 3 views
0

프로 시저에 문제가 있습니다. 우리는 2 개의 테이블을 가지고 있습니다 : 회사와 typeofcompanies. 회사에는 3 개의 열 ("companyid", "companyname", "typeofcompany")이 있고 typeofcompanies에는 2 개의 열 ("typeofcompanyId", "typeofcompany")이 있습니다. 우리는 우리가 그것을 만들어야합니다 typeofcompany하지 않은 경우pl pgSQL 프로 시저를 사용하여 값을 삽입 할 수 없습니다.

CREATE OR REPLACE FUNCTION insert_to_companies(c_name VARCHAR(255),toc INTEGER) 
     RETURNS VOID AS $$ 
      DECLARE i integer; 
      BEGIN 
      FOR i IN SELECT "typeofcompanyId" FROM typeofcompanies LOOP 
      IF toc = i THEN insert into public.companies(companyname, typeofcompany) VALUES (c_name,toc); 
       END IF; 
      END LOOP; 
      IF(SELECT companyname FROM companies WHERE companyname = c_name) = NULL THEN insert into public.typeofcompanies(typeofcompany) VALUES (toc); 
                      INSERT into public.companies(companyname,typeofcompany) VALUES (c_name,toc); 
      END IF; 
      END; 
    $$ LANGUAGE plpgsql VOLATILE; 

그래서 :

이 기업에 삽입 값에 대한 내 코드입니다. 하지만 내가 select insert_to_companies ("1", 5); 나는 오류 : 열 "1"이 존재하지 않습니다. 그래서 나는 그것이 매우 쉬운 문제라고 생각한다. 그러나 나는 3 시간 이상을 보내고 문제를 발견 할 수 없다. 나는

코드 liquibase로

회사를 테이블을 만드는 .... 도움이 필요하세요 :

<databaseChangeLog xmlns = "http://www.liquibase.org/xml/ns/dbchangelog/1.9" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9 
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd"> 
    <changeSet id="1" author="[email protected]" runOnChange="true" > 
     <createTable tableName ="companies"> 
      <column autoIncrement = "true" name = "companyid" type ="BIGINT"> 
       <constraints primaryKey ="true"></constraints> 
      </column> 
      <column name="companyname" type="VARCHAR(255)"> 
      </column> 
      <column name="typeofcompany" type="INTEGER"> 
      </column> 
     </createTable> 
    </changeSet> 
</databaseChangeLog> 

회사의 유형에 대해 :

<databaseChangeLog xmlns = "http://www.liquibase.org/xml/ns/dbchangelog/1.9" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9 
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd" > 
    <changeSet id="5" author="[email protected]" runOnChange="true" > 
     <createTable tableName ="typeofcompanies"> 
      <column autoIncrement = "true" name = "typeofcompanyId" type ="BIGINT"> 
       <constraints nullable="false" primaryKey="true"></constraints> 
      </column> 
      <column name = "typeofcompany" type="VARCHAR(255)"> 
       <constraints nullable="false"></constraints> 
      </column> 
     </createTable> 
    </changeSet> 
</databaseChangeLog> 
+0

최소 요구 사항 이런 종류의 질문을 위해 : 테이블 정의 ('CREATE TABLE' 문 sh 데이터 유형 및 제약 조건) 및 사용중인 버전의 Postgres가 포함되어 있습니다. 열을 나열하는 것만으로는별로 유용하지 않습니다. –

+0

Okey 미안, 내가 liquibase와 테이블을 작성해야합니다, 그래서이 liquibase 코드입니다 : –

+0

Liquibase이 질문에 무관합니다. SQL 코드를 보여주십시오. 그리고 아직도 당신의 Postgres 버전을 볼 수 없습니다. ('SELECT version()')'c_id + "_ type"이 어디서오고, 무엇을해야하는지 명확히하라. –

답변

0

테이블 정의를 다음과 같이 표시 될 수 있습니다.

이중 인용 낙타의 경우 이름을 사용하지

  • :
    CREATE TABLE company_type (
        company_type_id serial PRIMARY KEY 
    , company_type text UNIQUE NOT NULL 
    ); 
    
    CREATE TABLE company (
        company_id  serial PRIMARY KEY 
    , company   text NOT NULL 
    , company_type_id int REFERENCES company_type 
    ); 
    

    6,나는 변화의 몇했다. 가능한 한 피하십시오. PK ID에 대해 integer 대신 bigint 사용

  • . 나는 금세기에 회사 유형으로 핵심 공간을 다 써 버리리라는 것을 진지하게 생각합니다 ...
  • 단지 text을 사용합니다. varchar(255)은 일반적으로 Postgres에서 오해입니다.

최상의 기능 (또는 쿼리 만)은 사용 사례에 따라 크게 달라집니다. DB로드, 동시성, 정확한 요구 사항. 동시 쓰기가 가능합니다 경우에, 나는 경쟁 조건을 피하기 위해이 제안 :

CREATE OR REPLACE FUNCTION f_insert_to_companies(_c_name text, _toc text) 
    RETURNS void AS 
$func$ 
BEGIN 
LOOP 
    INSERT INTO company(company, company_type_id) 
    SELECT _c_name, t.company_type_id 
    FROM company_type t 
    WHERE company_type = _toc; 

    EXIT WHEN FOUND; 

    -- if type is missing, insert and keep looping  
    INSERT INTO company_type (company_type) 
    VALUES (_toc) 
    ON  CONFLICT (company_type) DO NOTHING; 
END LOOP; 
END 
$func$ LANGUAGE plpgsql; 

dbfiddle here

관련 (상세 설명 포함) :

관련 문제