2010-04-07 6 views
2

함수 내에서 뷰를 만들려고 할 때 ERROR가 발생합니다 : $ 1 매개 변수가 없습니다. 이것은 샘플 코드입니다.

Begin 

CREATE VIEW artikelnr AS 
SELECT datum, 'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven" 
FROM uitgifteregel 
JOIN artikel ON artikel.artikelnr = new.artikelnr 
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 

UNION 
SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven" 
FROM ontvangstregel 
JOIN artikel ON artikel.artikelnr = new.artikelnr 
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; 
Return new; 
end; 

우리는 값 그것이해야처럼 작동 1 라인 7 new.artikelnr 교체 할 때,하지만 기능은 다른 artikelnr의 작업을 할 필요가있다.

예를 행 7 : JOIN artikel ON artikel.artikelnr = new.artikelnr

가 올바른 방향으로 우리를 가리 킵니다하시기 바랍니다.

응답 : 교육적 목적으로이보기를 만들어야합니다. 나는 뷰의 이미지와 우리의 데이터베이스의 tablestructure을 업로드 한 :

http://img208.imageshack.us/img208/5655/tablesk.jpg

우리의 첫 번째 목표는 하나 개의 관련 기사에 대한 뷰를 만드는 것이 었습니다. 우리는 다음 코드로이 달성 : 우리가 달성 할 수

CREATE VIEW artikelmutatiestotaal AS 
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven" 
FROM uitgifteregel, ontvangstregel 
UNION 
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven" 
FROM uitgifteregel 
JOIN artikel ON artikel.artikelnr = 1 
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 
UNION 
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven" 
FROM ontvangstregel 
JOIN artikel ON artikel.artikelnr = 1 
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr 

유일한 것은 우리의 삽입 문에서 artikelnr의 값을 얻는 것입니다. 우리가

JOIN artikel ON artikel.artikelnr = 1 

에 맞춰 7 JOIN artikel ON artikel.artikelnr = new.artikelnr 를 교체 할 때

CREATE FUNCTION addview() returns trigger as ' 
Begin 
CREATE VIEW artikelnr AS 
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven" 
FROM uitgifteregel, ontvangstregel 
UNION 
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven" 
FROM uitgifteregel 
JOIN artikel ON artikel.artikelnr = new.artikelnr 
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 
UNION 
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven" 
FROM ontvangstregel 
JOIN artikel ON artikel.artikelnr = artikelnr 
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr 
end; 
'language plpgsql; 

는 그것을 잘 작동합니다. 내 질문을 매우 unstructured 게시 죄송합니다. 나는이 질문에 답하기 위해 어떤 정보가 중요한지 잘 모른다.

+0

내 대답에 대한 새 편집보기 – zendar

+0

왜 이름이 같은 여러보기를 만들려고합니까? 그게 효과가 없을거야. 그리고 각 견해마다 다른 예술가가 있습니까? 당신의 목표는 무엇입니까? 해결하려는 근본적인 문제는 무엇입니까? –

답변

0

어떤 데이터베이스인가요?

new은 (는) 키워드가 무엇입니까? 이 코드가 일부 트리거에서 복사 되었습니까?

  • JOIN 절에 new을 올바른 테이블 이름으로 바꿉니다. 난 당신이 필드 이름을 잘못 입력 할 때 올바르게, MS Access에 비슷한 오류를보고 기억한다면
  • Return new;

를 제거합니다.
다음으로 모든 필드 이름을 확인해야합니다. 또는 일부 시각적 쿼리 작성기를 사용하여 해당 유니온 쿼리를 만들어 모든 필드 이름이 올바른지 확인하십시오.

나는 당신이 그 CASE 문을 느슨하게 그냥 0 AS "Some Fieldname"

이 시도 쓸 수 있다고 생각합니다. 그것은 작동해야합니다.
내가 PostgreSQL을에 대해 잘 모르겠지만, 당신은 아마 EXECUTE SCRIPT로 보일 것입니다 - 매개 변수로 artikelnr을 보낸 다음에 뷰에 대한 DDL을 구성 :

CREATE OR REPLACE VIEW artikelnr AS 
    SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen", 
     aantal as "aantal uitgegeven" 
    FROM uitgifteregel 
    JOIN artikel ON artikel.artikelnr = uitgifteregel.artikelnr 
    JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr 

UNION 
    SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , 
     0 as "aantal uitgegeven" 
    FROM ontvangstregel 
    JOIN artikel ON artikel.artikelnr = ontvangstregel.artikelnr 
    JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; 

편집 (나는 데이터베이스에 대해 테스트하지 않았다) 스크립트.

다른 데이터베이스 (Oracle 및 SQL 서버)에 대한 경험을 토대로 각 레코드에 대해 하나의보기를 만들어야한다고 생각하지 않습니다. 이 접근 방식으로 무엇을 달성하려고합니까?

미리 컴파일 된 뷰와이 이득 실행 속도를 갖는 것이 목표라면 매개 변수화 된 쿼리를 사용하여 동일한 작업을 수행 할 수 있습니다. 저장 프로 시저에 넣고 artikelnr을 매개 변수로 보냅니다.

성능상의 이유로 적합하지 않은 경우 왜 이렇게하고 있는지 설명해주십시오.

편집 2 :
답변 : 그런 식으로보기를 만들 수 없습니다. 문제는 CREATE VIEW이 값을 바꾸지 않고 명령문을 취한다는 것입니다. new.artikelnr으로 뷰를 생성하려고 시도하고 테이블 new이 트리거 외부에 없기 때문에 실패합니다. 구문을 문자열이나 파일로 생성 한 다음 해당 명령문을 실행해야합니다. 나는 PostgreSQL에 대한 문서를 확인했고 동적 명령을 구성하고 실행하는 데 사용되는 EXECUTE 명령이 있습니다. 이런 식으로 뭔가 아마 작동합니다 :

EXECUTE 
    'CREATE OR REPLACE VIEW artikelnr AS ' 
    || ' SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen",' 
    || ' aantal as "aantal uitgegeven" ' 
    || ' FROM uitgifteregel ' 
    || ' JOIN artikel ON artikel.artikelnr = ' 
    || new.artikelnr 
    || ' JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr ' 
    || ' UNION ' 
    || ' SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , ' 
    || '  0 as "aantal uitgegeven" ' 
    || ' FROM ontvangstregel ' 
    || ' JOIN artikel ON artikel.artikelnr = ' 
    || new.artikelnr 
    || ' JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; ' 

이 잘 장소에 삽입 new.artikelnr 값을 하나의 거대한 CONCAT입니다. 리터럴 값 artikelnr을 SQL 코드에 "삽입"하면 EXECUTE 문을 통해 실행되는 SQL이 생성됩니다.

위의 코드는 인용에 대해서는 신경 쓰지 않으며 실제로는 작동하지 않습니다 (이 예제는 교육적 목적을위한 것이므로 연습 문제로 수정해야 함).

documentation for EXECUTE statement에는 위 명령을 올바르게 작성하는 데 사용해야하는 인용 기능을 사용하는 예제가 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 우리가 사용하는 데이터베이스는 postgresql입니다. 이 코드 조각은 다음 트리거에 의해 실행될 함수입니다. CREATE TRIGGER addview 각 줄에 artikel을 삽입 한 후 EXECUTE PROCEDURE addview(); 새 artikel을 삽입하면 트리거가 작동합니다. artikelnr은 productnr과 같은 의미입니다. artikelnr은 artikel 테이블의 기본 키입니다. new.artikelnr 우리 insert 문에 artikelnr에 대한 참조입니다. 나는 이것이 어떤 것들을 정리하기를 희망한다. – user311064

+0

안녕하세요. 코멘트는 정보를 추가하기에 너무 적은 공간을 남기기 때문에이 게시물을 편집했습니다. 나는 그것이 도움이되기를 바랍니다. – user311064

+0

도와 주셔서 감사합니다. 나는 문서를보고 execute 문을 사용할 것이다. – user311064

관련 문제