我有一个 SQL Server 表,其中包含一些数据,如下所示。P列的数量是固定的,但会出现太多的列。时尚方面会有多个栏目,如S1、S2等
| ID | 已选P | P1 | P2 | P3 | P4 | P5 |
|---|---|---|---|---|---|---|
| 1 | P2 | 3 | 8 | 4 | 15 | 7 |
| 2 | P1 | 0 | 2 | 6 | 0 | 3 |
| 3 | P3 | 1 | 15 | 2 | 1 | 11 |
| 4 | P4 | 3 | 4 | 6 | 2 | 4 |
我需要编写一条 SQL 语句来得到下面的结果。基本上,需要从每行中选择哪一列取决于该行本身的 SelectedP 值。SelectedP 包含要为每行选择的列。
| ID | 已选P | 选定的 P 值 |
|---|---|---|
| 1 | P2 | 8 |
| 2 | P1 | 0 |
| 3 | P3 | 2 |
| 4 | P4 | 2 |
提前致谢。
动态请求如下所示:
request := 'select * from ' || param_table_name || ' where ' || column_name_list;
Run Code Online (Sandbox Code Playgroud)
然后我做:
open cur1 for request;
Run Code Online (Sandbox Code Playgroud)
直接获取的记录的确切类型cur1直到运行时才会知道,因为它应该对应用此过程的任何表不施加任何限制.但是,我如何迭代查询返回的内容?
我需要一些PIVOT表或其他东西的帮助来获得我需要的结果.
我有一张这样的桌子.
+---------------+--------------+----------+-----------+---------------+-----------------------------------------+-----------------+---------------+------------------+----------+-------+------------+--------------+------------+-------------------+----------------+----------+-------------------+
| Client_Id | Project_Id | Hotel_Id | Room_Type | Room_Category | Allotment_Date | Number_Of_Rooms | Number_Booked | Number_Available | Overbook | Price | Dep_Amount | Full_Payment | Admin_Only | HotelAllotment_Id | Price_Excl_VAT | VAT_Code | Charge_Dep_Amount |
+---------------+--------------+----------+-----------+---------------+-----------------------------------------+-----------------+---------------+------------------+----------+-------+------------+--------------+------------+-------------------+----------------+----------+-------------------+
| DEFAULT | TEMPLATE | 2423 | 276 | | 2010-12-05 00:00:00 | 99999 | 1 | 99998 | 0 | 33000 | 0 | 1 | 0 | 279611 | 0 | | 0 |
| DEFAULT | …Run Code Online (Sandbox Code Playgroud) 例如:
abc:='select * from table1';
Run Code Online (Sandbox Code Playgroud)
result:='create view'||quote_ident(view1)||'as'||abc;
Run Code Online (Sandbox Code Playgroud) 例如:我有一个名为“view1”的视图,其中包含“name”和“slno”列,现在我希望使用名为“f1”的函数显示它,如下所示:
- 功能
create or replace function f1(viewname varchar)
returns table (name varchar,slno integer) as
$body$
begin
return query
select * from viewname;
end;
$body$
language plpgsql;
Run Code Online (Sandbox Code Playgroud) 我试图execute immediate用作分配变量值的特殊要求.我使用以下代码并获得如下异常.
declare
lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
l_str varchar2(400);
a number(10);
begin
select *
into lv_kyc_main_GBL
from KYC_GBL_MAIN.KYC_MAIN
where rownum = 1;
-- l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';
l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
dbms_output.put_line(l_str);
execute immediate (l_str);
end;
/
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
anonymous block completed
lv_kyc_main_GBL.legal_name := 'TEST'
Run Code Online (Sandbox Code Playgroud)
在命令的第4行开始出错:
declare
lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
l_str varchar2(400);
a number(10);
begin
select *
into lv_kyc_main_GBL
from KYC_GBL_MAIN.KYC_MAIN
where rownum = 1;
--l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';
l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
dbms_output.put_line(l_str);
execute immediate (l_str);
end;
/
Error report:
ORA-00900: invalid SQL statement
ORA-06512: …Run Code Online (Sandbox Code Playgroud) 我正在使用Oracle 11g数据库,发布11.2.0.3.0 - 64位生产
我有几个已定义的包,过程,函数和数据类型.在使用集合,数组和其他数据结构进行大量中间计算之后,我最终需要动态创建数据库表以输出我的最终结果.出于这个问题的目的,我有以下内容:
TYPE ids_t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
benefit_ids ids_t;
--Lots of other code which successfully populates benefit_ids.
--benefit_ids has several million rows, and is used successfully as
the input to the following function:
FUNCTION find_max_ids(in_ids in ids_t)
RETURN ids_t
IS
str_sql varchar2(200);
return_ids ids_t;
BEGIN
str_sql := 'SELECT max(b.benefit_id)
FROM TABLE(:1) a
JOIN benefits b ON b.benefit_id = a.column_value
GROUP BY b.benefit_id';
EXECUTE IMMEDIATE str_sql BULK COLLECT INTO return_ids USING in_ids;
RETURN return_ids; …Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,其中 Execute Immediate 将调用“Begin ... End”块,其中包含另一个 Execute Immediate,只有在满足特定条件时才会调用该块。
"Begin... End clock" 内部的 Execute Immediate 命令用单引号括起来。所以它看起来像
BEGIN
...SOME STUFF HERE...
FOR ..... LOOP
EXECUTE IMMEDIATE
'BEGIN
IF (condition) THEN
EXECUTE IMMEDIATE 'DML STRING'
END IF
END;'
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
这就引出了另一个问题,是否可以从循环内调用 Execute Immediate 语句。我认为答案是肯定的。
我有一个执行立即的查询字符串.
我怎么能执行立即这个PL/SQL?
query string ='执行立即选择....';
想要这样做: Execute immediate 'query string';
这变成了: Execute immediate 'Execute immediate select ....;';
你知道我怎么能这样做?
我试图通过循环传递我想要调用的过程的名称,因为我需要连续调用 3 个类似的过程。
让我们打电话给他们:
它们每个都有 1 个输入变量和 2 个输出变量。
关于我可以改变什么来让它工作的任何想法?
FOR l_counter in 1..3
LOOP
SELECT PROC_NAME into V_PROC FROM PROC_LIST WHERE PROC_ID = l_counter;
EXECUTE IMMEDIATE 'PROC_DB.' || V_PROC || '(1,V_STEP_ERROR_CODE,V_STEP_MSG)';
COMMIT;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
第 5 行当前失败。(立即执行)带有:“无效的 SQL 语句”