首先,我對Oracle PLSQL非常生疏,而且我看到有幾個人說這不可能完成,其他人說可以,我只是無法做到這一點。任何幫助將不勝感激。PLSQL動態獲取記錄中的屬性值?
我想讀動態記錄類型的列的值。
我有一個帶有標記的消息,我需要用記錄集中的值替換標記。
因此,該消息是這樣的:[狀態]由[AGENT_NAME]
我有我在哪裏解析出令牌另一個地方。
在Java腳本,我知道這可以實現:(將在控制檯上運行)
var record = {
status : "Open",
agent_name : "John"
};
var record2 = {
status : "Close",
agent_name : "Joe"
};
var records = [record, record2];
var token1 = "status";
var token2 = "agent_name";
for(var i=0; i<records.length; i++){
console.log(records[i][token1] + " by " + records[i][token2]);
}
Results : Open by John
Close by Joe
我想做同樣的事情在PLSQL
這裏是我的測試PLSQL:
SET SERVEROUTPUT ON;
declare
TYPE my_record is RECORD
(
status VARCHAR2(30),
agent_name varchar2(30)
);
TYPE my_record_array IS VARRAY(6) OF my_record;
v_records my_record_array := my_record_array();
v_current_rec my_record;
v_current_rec2 my_record;
v_token varchar2(50):= 'agent_name';
v_token2 varchar2(50):= 'status';
begin
v_current_rec.status := 'Open';
v_current_rec.agent_name := 'John';
v_records.extend;
v_records(1) := v_current_rec;
v_current_rec2.status := 'Close';
v_current_rec2.agent_name := 'Ron';
v_records.extend;
v_records(2) := v_current_rec2;
FOR i IN 1..v_records.COUNT LOOP
--Hard coded
DBMS_OUTPUT.PUT_LINE(v_records(i).status || ' by ' || v_records(i).agent_name);
--Substitution vars entering v_records(i).status and v_records(i).agent_name for the prompts.
--How to do this without user interaction.
DBMS_OUTPUT.PUT_LINE(&status || ' by ' || &agent_name);
--Dynamically that doesn't work. How would this be accomplished
DBMS_OUTPUT.PUT_LINE(v_records(i).v_token || ' by ' || v_records(i).v_token2);
END LOOP;
END;
我嘗試使用替代變量,如果我使用,將工作:
DBMS_ OUTPUT.PUT_LINE(& agent_name)並在出現提示時輸入v_records(i).agent_name。我如何在飛行中完成此操作?
答:
set serveroutput on;
DECLARE
type sr_record_map
IS
TABLE OF VARCHAR2(30) INDEX BY VARCHAR2(30);
type record_set
is
TABLE of sr_record_map index by BINARY_INTEGER;
v_current_rec sr_record_map;
v_record_set record_set;
v_token varchar2(30) := 'status';
v_token2 varchar2(30) := 'agent_name';
v_index number :=1;
begin
v_current_rec('status') := 'Open';
v_current_rec('agent_name') := 'John';
v_record_set(1) := v_current_rec;
v_current_rec('status') := 'Close';
v_current_rec('agent_name') := 'Joe';
v_record_set(2) := v_current_rec;
FOR i in 1..v_record_set.COUNT LOOP
v_current_rec := v_record_set(i);
DBMS_OUTPUT.PUT_LINE(v_current_rec(v_token) || ' by ' || v_current_rec(v_token2));
END LOOP;
end;
你說,你的記錄可能有任何成員(列),你想通過選擇一個打印它們? –
我有多個消息,可能有任何數量的令牌。我知道這些字段存在於記錄中。因此,如果我有令牌代理名稱,我想要評估字符串v_records(i).agent_name並從記錄中獲取值。所以我可以用值替換消息中的令牌。 – John