Oracle 10g에서는 PL/SQL에서 다음을 수행 할 수 있습니까?문자열 형식의 모든 테이블에서 모든 행의 모든 열을 잘라내는 방법은 무엇입니까?
for each table in database
for each row in table
for each column in row
if column is of type 'varchar2'
column = trim(column)
고마워요!
Oracle 10g에서는 PL/SQL에서 다음을 수행 할 수 있습니까?문자열 형식의 모든 테이블에서 모든 행의 모든 열을 잘라내는 방법은 무엇입니까?
for each table in database
for each row in table
for each column in row
if column is of type 'varchar2'
column = trim(column)
고마워요!
물론 대규모 동적 업데이트를 수행하는 것은 잠재적으로 위험하고 시간이 오래 걸릴 수 있습니다. 그러나 원하는 명령을 생성하는 방법은 다음과 같습니다. 이것은 하나의 스키마를위한 것이며 명령을 작성하여 출력합니다. 실행하기 전에 스크립트에 복사하여 검토 할 수 있습니다. 또는 dbms_output.put_line(...)
에서 EXECUTE IMMEDIATE ...
으로 변경하여이 스크립트가 생성 된 모든 명령문을 실행하도록 할 수 있습니다.
SET SERVEROUTPUT ON
BEGIN
FOR c IN
(SELECT t.table_name, c.column_name
FROM user_tables t, user_tab_columns c
WHERE c.table_name = t.table_name
AND data_type='VARCHAR2')
LOOP
dbms_output.put_line(
'UPDATE '||c.table_name||
' SET '||c.column_name||' = TRIM('||c.column_name||') WHERE '||
c.column_name||' <> TRIM('||c.column_name||') OR ('||
c.column_name||' IS NOT NULL AND TRIM('||c.column_name||') IS NULL)'
);
END LOOP;
END;
USER_TAB_COLUMNS에는 테이블과 뷰에있는 열이 있습니다. 이 작업을 수행하려면보기를 필터링해야합니다. – Allan
데이터베이스에 VARCHAR2 유형의 열이있는 많은 테이블이 포함되어있는 경우 dbms_output.put_line의 버퍼가 모든 UPDATE 문을 포함하기에 충분하지 않으므로 INSERT를 사용하여 Oracle 테이블에 UPDATE 문을 저장하는 것이 편리합니다 문을 DBMS_OUTPUT.PUT_LINE 문 대신 사용하십시오. – UltraCommit
닭고기,하지만 다시는 내 테이블에 대한 몇 가지, 난 그냥 출력 버퍼를 증가, 그리고 괜찮 았어. – daveslab
아마도 데이터베이스가 아닌 스키마의 모든 열에 대해이 작업을 수행하려고 할 것입니다. 사전 테이블에이 작업을 수행하려고하면
declare
v_schema varchar2(30) := 'YOUR_SCHEMA_NAME';
cursor cur_tables (p_schema_name varchar2) is
select owner, table_name, column_name
from all_tables at,
inner join all_tab_columns atc
on at.owner = atc.owner
and at.table_name = atc.table_name
where atc.data_type = 'VARCHAR2'
and at.owner = p_schema;
begin
for r_table in cur_tables loop
execute immediate 'update ' || r.owner || '.' || r.table_name
|| ' set ' || r.column_name || ' = trim(' || r.column_name ||');';
end loop;
end;
이
는 처음에 VARCHAR2s입니다 필드 작동합니다 ... 좋은 생각이 될 것입니다. 데이터베이스에 CHAR 필드가 있으면 CHAR 필드가 항상 최대 길이로 채워지기 때문에 운이 없어진 것입니다.
는 USER_TABLES에서보세요 http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/statviews_5443.htm 및 USER_TAB_COLUMNS http://download.oracle .com/docs/cd/B28359_01/server.111/b28320/statviews_5429.htm # REFRN26277 시스템 테이블. 나는 당신이 원하는 것을하기 위해 동적 질의를 공식화 할 수 있어야한다고 생각합니다. –
유용한 질문! ;-) – UltraCommit
@ pm_2 제안에 대해 대단히 감사합니다. 아래에있는 사람들이 한 것처럼 보입니다. – daveslab