2013-01-02 4 views
0

스펙에서 벗어나려면 PostgreSQL 9.2를 사용하고 PgAdmin3을 통해 데이터베이스를 사용하고 테이블의 형식을 셰이프 파일로 사용하십시오. 추가 세부 사항이 필요한 경우 편집하고 제공합니다.저장 프로 시저에 객체 (테이블 또는 컬럼) 이름을 전달하는 방법

필자는 기본적으로 다른 열의 문자열 값이 null인지 여부에 따라 정수 값 열에서 정수 값을 업데이트하려고합니다. 결국 jdbc를 사용하여 Java 응용 프로그램에서 실행되도록 저장된 함수를 이식하려고하지만 먼저 pgadmin3 내에서 함수를 테스트하고 싶습니다. postgresql에 대한 경험이 거의 없으며 구문에 약간의 오류가 있습니다.

필자가 필요로하는 아이디어와 여기에 넣을 매개 변수는 name, argmode, argname, argtype, column_name 및 lang_name입니다.

아무 것도 반환하지 않으면 RETURNS void를 $$로 포함 시키거나 단순히 return 문을 포함하지 않을 수 있음을 이해합니다. 나는 결과 집합이 필요하다고 생각하지 않는다. 단지 정수 값을 한 열로 대체하기를 원한다. 처리하려는 열을 전달하기 위해 필요한 테이블을 참조하는 방법을 잘 모르겠습니다.

CREATE [OR REPLACE] FUNCTION handle_malformed([[VARIADIC][] 
table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name]) 

BEGIN 
LOOP 
IF NAME_1 IS NULL THEN 
IF LEVEL_DEPT != 0 THEN 
    UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 0; 
ELSE IF NAME_2 IS NULL THEN 
    IF LEVEL_DEPT != 1 THEN 
     UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 1; 
ELSE IF NAME_3 IS NULL THEN 
    IF LEVEL_DEPT != 2 THEN 
     UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 2; 
ELSE IF NAME_4 IS NULL THEN 
    IF LEVEL_DEPT != 3 THEN 
     UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 3; 
ELSE IF NAME_5 IS NULL THEN 
    IF LEVEL_DEPT != 4 THEN 
     UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 4; 
ELSE 
    IF LEVEL_DEPT !=5 THEN 
     UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 5; 
EXCEPTION 
END LOOP; 
END PROCEDURE; 
$$ LANGUAGE plpgsql; 

update handle_malformed(AdminBoundaries.NAME_5, AdminBoundaries.NAME_4, AdminBoundaries.NAME_3, 
AdminBoundaries.NAME_2, AdminBoundaries.NAME_1, AdminBoundaries.NAME_0, AdminBoundaries.WIKI_URL, AdminBoundaries.LEVEL_DEPT) 

I가 넣어 논리 I는 I 달성 할 로직 루프 및 종료 루프 사이에 넣어 로직 : 여기

제가 지금까지 함께 자갈길 한 코드이다.

제 질문은 SQL의 인수에서 열 이름을 어떻게 사용합니까?

+0

무엇이 문제입니까? – Eelke

+0

나는 질문을 편집했다. 감사. – J10598

+0

대문자로 된 식별자는 열 이름으로 간주됩니까? 왜 당신은 그 논쟁을 열 번 반복합니까? 인수의 의도는 무엇입니까? 함수는 인수를 사용하지 않는 것으로 보입니까? – wildplasser

답변

3

의견을 바탕으로 질문을 포함하도록 질문을 편집했습니다 .... 이해할 수있는대로 인수의 값을 쿼리에 사용하고 싶습니다. 이렇게하려면 EXECUTE를 사용하고 쿼리를 문자열로 어셈블합니다. 이 정렬의 식별자를 매개 변수화 할 수 없으므로 이들을 연결해야하며 quote_ident()을 사용하여 저장 프로 시저 SQL 삽입을 방지해야합니다.

그래서 대신 :

UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 1; 

사용 :

EXECUTE $e$ UPDATE AdminBoundaries SET $e$ || quote_ident(LEVEL_DEPT) || $e$ = 1 $e$; 
당신은뿐만 아니라 동적 검사를 처리하기 위해 실행할 수 있습니다

: 내 생각

EXECUTE INTO my_bool $e$ SELECT a.$e$ || quote_ident(level_dept) $e$ is not null $e$; 

을이 질문을 기반으로 응답 의견. 그렇지 않은 경우 명확하게 설명하십시오.

관련 문제