sqlplus에서 pl/sql 내에 동적 EXECUTE 출력 표시
의 동적 선택 결과를 가져오는 방법EXECUTE
PL/SQL에서Oracle sqlplus
?
나는 모든 것의 합계를 수집하기 위해 간단한 sqlplus 스크립트를 작성하고 있습니다.NUMBER
지정된 표의 열:
SET SERVEROUTPUT ON
DECLARE
CURSOR column_cur IS
SELECT column_name FROM ALL_TAB_COLS
WHERE owner = '&scheme_name' AND table_name = '&table_name'
AND data_type = 'NUMBER';
sql_query VARCHAR2(32767);
BEGIN
sql_query := 'select ';
FOR column_rec IN column_cur LOOP
sql_query := sql_query || 'SUM(' || column_rec.column_name ||
') "SUM(' || column_rec.column_name || ')", ';
END LOOP;
sql_query := substr(sql_query, 0, length(sql_query)-2) || -- remove trailing ', '
' from &scheme_name' || '.&table_name';
EXECUTE IMMEDIATE sql_query;
END;
/
동적으로 생성된 SQL 문을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
SUM(X) | SUM(Y) | SUM(Z) |
--------------------------
111 | 222 | 333 |
하지만, 심지어는.SET SERVEROUTPUT ON
sqlplus 스크립트를 실행하면 다음만 제공됩니다.
PL/SQL procedure successfully completed.
결과를 표시하려면 SELECT에서 결과를 검색해야 합니다.당신은 신택스를 사용할 것입니다.EXECUTE IMMEDIATE sql_query INTO var1, var2.. varn
그러나 이 경우 컴파일 시 열 수를 알 수 없습니다.
이 문제를 해결할 수 있는 여러 가지 방법이 있습니다.
- DBMS_SQL을 사용하여 출력 열을 루프할 수 있습니다.
- XML의 CSV와 같은 읽기 쉬운 형식으로 모든 결과가 포함된 열을 만들 수 있습니다.
데모 1:
SQL> DEFINE scheme_name=SYS
SQL> DEFINE table_name=ALL_OBJECTS
SQL> DECLARE
2 sql_query VARCHAR2(32767);
3 l_cursor NUMBER := dbms_sql.open_cursor;
4 l_dummy NUMBER;
5 l_columns dbms_sql.desc_tab;
6 l_value NUMBER;
7 BEGIN
8 sql_query := 'select ';
9 FOR column_rec IN (SELECT column_name
10 FROM ALL_TAB_COLS
11 WHERE owner = '&scheme_name'
12 AND table_name = '&table_name'
13 AND data_type = 'NUMBER') LOOP
14 sql_query := sql_query || 'SUM(' || column_rec.column_name
15 || ') "SUM(' || column_rec.column_name || ')", ';
16 END LOOP;
17 sql_query := substr(sql_query, 0, length(sql_query) - 2)
18 || ' from &scheme_name' || '.&table_name';
19 dbms_sql.parse(l_cursor, sql_query, dbms_sql.NATIVE);
20 dbms_sql.describe_columns(l_cursor, l_dummy, l_columns);
21 FOR i IN 1..l_columns.count LOOP
22 dbms_sql.define_column(l_cursor, i, l_columns(i).col_type);
23 END LOOP;
24 l_dummy := dbms_sql.execute_and_fetch(l_cursor, TRUE);
25 FOR i IN 1..l_columns.count LOOP
26 dbms_sql.column_value(l_cursor, i, l_value);
27 dbms_output.put_line(l_columns(i).col_name ||' = '||l_value);
28 END LOOP;
29 END;
30 /
SUM(DATA_OBJECT_ID) = 260692975
SUM(OBJECT_ID) = 15242783244
언급URL : https://stackoverflow.com/questions/1366426/display-dynamic-execute-output-within-pl-sql-from-sqlplus
'programing' 카테고리의 다른 글
MariaDB(로컬 호스트)에 대한 ODBC 연결 생성 (0) | 2023.08.20 |
---|---|
파워셸에서 각 개체와 각 개체의 차이 (0) | 2023.08.20 |
아이폰 중지 취소 방법 perform Selector (0) | 2023.08.20 |
도커 컨테이너에서 호스트 포트에 액세스하는 방법 (0) | 2023.08.20 |
redux 형식의 Ajax 호출과 같은 비동기 소스를 기반으로 초기 값을 설정하는 방법 (0) | 2023.08.20 |