[SQL] 그것은 오라클의 매개 변수로 테이블 이름을 통과 할 수 있습니까?
SQL그것은 오라클의 매개 변수로 테이블 이름을 통과 할 수 있습니까?
이 같은 저장 프로 시저를 만들려면 :
PROCEDURE P_CUSTOMER_UPDATE
(
pADSLTable IN Table,
pAccountname IN NVARCHAR2,
pStatus IN NUMBER,
pNote IN NVARCHAR2,
pEmail IN NVARCHAR2,
pMobi IN NVARCHAR2,
pServiceTypeID IN NUMBER,
pDate IN DATE
)
IS
BEGIN
UPDATE pADSLTable
SET STATUS = pStatus, NOTE = pNote, EMAIL = pEmail, MOBI = pMobi, SERVICETYPE_ID = pServiceTypeID, ACTIVATION_DATE = pDate
WHERE ACCOUNT_NAME = pAccountname;
END;
물론, 오라클은 나에게 그렇게하지 않습니다. 이 문제를 해결할 수있는 방법이 있습니까? 대단히 감사합니다.
해결법
-
==============================
1.당신은 정확히 같은 열 이름과 데이터 유형과 여러 다른 테이블이? 닷지 디자인 냄새가.
당신은 정확히 같은 열 이름과 데이터 유형과 여러 다른 테이블이? 닷지 디자인 냄새가.
데이터베이스 같은 간단한 SQL에서 객체 어쨌든, 우리는 변수를 사용할 수 없습니다. 우리는 동적 SQL을 사용해야합니다.
PROCEDURE P_CUSTOMER_UPDATE ( pADSLTable IN USER_TABLES.table_name%type, pAccountname IN NVARCHAR2, pStatus IN NUMBER, pNote IN NVARCHAR2, pEmail IN NVARCHAR2, pMobi IN NVARCHAR2, pServiceTypeID IN NUMBER, pDate IN DATE ) IS BEGIN execute immediate 'UPDATE '||pADSLTable ||' SET STATUS = :1, NOTE = :2, EMAIL = :3, MOBI = :4, SERVICETYPE_ID = :5, ACTIVATION_DATE = :6' ||' WHERE ACCOUNT_NAME = :7' using pStatus, pNote, pEmail, pMobi, pServiceTypeID, pDate, pAccountname; END;
동적 SQL의 사용을 피하는 이유 중 하나는 남용 열려 있다는 것입니다. 악성 사람들은 우리의 보안 우회 시도하는 매개 변수를 사용할 수 있습니다. 이것은 SQL 주입이라고합니다. 나는 사람들이 이상 SQL 주입의 중요성을 추정 생각합니다. 자동으로 위협이 아니다. 예를 들어 절차는 패키지에서 개인 절차는 누군가가 그것을 공중 납치 것 같지는 않다 (즉 사양에 선언되지 않은) 경우.
그러나 예방 조치를하는 것이 합리적이다. DBMS_ASSERT은 SQL 주입 공격을 시도 트랩에 오라클 10g에 도입 된 패키지입니다. 그것은이 전달 된 테이블 이름을 확인하는 데 사용 가치가있을 것입니다이 경우
.... 'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable) ....
이것은 누구 통과 'pay_table 세트 급여 = 급여 * 10 어디 ID = 1234 -'방지 할 테이블 이름 매개 변수로.
피하기 동적 SQL 또 다른 이유는 디버그 오른쪽 열심히 얻기 위해 열심히 것입니다. 실제 문장의 구문은 런타임에 확인됩니다. 이 절차에 구문 예외를 던지는하지 않도록 모든 전달 된 입력의 유효성을 검사 단위 테스트의 전체 제품군을 가지고하는 것이 좋다.
마지막으로, 동적 SQL은 ALL_DEPENDENCIES으로보기에 표시되지 않습니다. 이것은 어렵게 영향 분석을 수행하고 주어진 테이블 또는 열을 사용하는 모든 프로그램을 찾을 수 있습니다.
-
==============================
2.예, 기본 동적 SQL이 있습니다 :
예, 기본 동적 SQL이 있습니다 :
EXECUTE IMMEDIATE 'UPDATE ' || pADSLTable || 'SET STATUS = :1, NOTE = :2, EMAIL = :3, MOBI = :4, SERVICETYPE_ID = :5, ACTIVATION_DATE = :6 WHERE ACCOUNT_NAME = :7 ' USING pStatus, pNote, pEmail, pMobi, pServiceTypeId, pDate, pAccountname;
성능 및 오류 검사는 좋은 (NO 컴파일시 구문 및 스키마 검증)으로하지 않습니다. SQL 주입 조심하십시오.
그래서, 당신은, 대신 모든 옵션이있는 경우 / 다음 / 다른 구조를 사용하는 것을 고려 선택할 수있는 테이블의 몇이있는 경우.
-
==============================
3.당신은 동적 SQL을 사용하여 DDL 문 모든 종류를 사용할 수 있습니다. 당신은 매개 변수로 다른 데이터베이스 개체의 이름을 전달하거나 변수로 조작 할 수 있습니다.
당신은 동적 SQL을 사용하여 DDL 문 모든 종류를 사용할 수 있습니다. 당신은 매개 변수로 다른 데이터베이스 개체의 이름을 전달하거나 변수로 조작 할 수 있습니다.
from https://stackoverflow.com/questions/3690038/is-it-possible-to-pass-table-name-as-a-parameter-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 그것은 반복과 비어있는 경우 다른 값이 SQL에 올 때까지 열 값을 하나의 시간을 표시하는 방법 (0) | 2020.06.15 |
---|---|
[SQL] 어떻게 PostgreSQL의에서 배열의 요소에 대한 인덱스를 만드는 방법? (0) | 2020.06.15 |
[SQL] 윈도우 함수 또는 공통 테이블 표현식 : 범위 내에서 이전 행을 계산 (0) | 2020.06.15 |
[SQL] 여러 행에 분할 열 (0) | 2020.06.15 |
[SQL] OPENROWSET와 Excel로 SQL 서버 수출 (0) | 2020.06.15 |