У меня есть сценарий, в котором у меня есть главная таблица, в которой хранятся имя таблицы БД и имя столбца, мне нужно построить динамический запрос на основе этого.
CREATE TABLE MasterTable
(
Id int primary key,
caption varchar(100),
dbcolumnname varchar(100),
dbtablename varchar(100)
);
CREATE TABLE Engineers
(
Id int primary key,
Name varchar(100),
Salary BigInt
);
CREATE TABLE Executives
(
Id int primary key,
Name varchar(100),
Salary BigInt
);
CREATE TABLE Manager
(
Id int primary key,
Name varchar(100),
Salary BigInt
);
INSERT INTO Manager(Id, Name, Salary)
VALUES(1, 'Manager 1', 6000000);
INSERT INTO Executives(Id, Name, Salary)
VALUES(1, 'Executive 1', 6000000);
INSERT INTO Engineers(Id, Name, Salary)
VALUES(1, 'Engineer 1', 6000000);
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (1, 'Name', 'name', 'Engineers');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (2, 'Name', 'name', 'Manager');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (3, 'Name', 'name', 'Executives');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (4, 'Salary', 'Salary', 'Engineers');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (5, 'Salary', 'Salary', 'Manager');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (6, 'Salary', 'Salary', 'Executives');
Я хочу создать хранимую процедуру, которая принимает заголовок и идентификатор и возвращает результат на основе имени столбца базы данных и имени таблицы базы данных. Например, если я передам Salary, Name как заголовок и Id как 1, хранимая процедура должна быть запросом dbcolumn и dbtable, как показано ниже.
Select Id as ID, name as Value from Engineers
UNION
Select Id as ID, name as Value from Manager
UNION
Select Id as ID, name as Value from Executives
UNION
Select Id as ID, Salary as Value from Executives
UNION
Select Id as ID, Salary as Value from Engineers
UNION
Select Id as ID, Salary as Value from Manager
Я слышал о динамическом sql, можно ли его здесь использовать?
РЕДАКТИРОВАТЬ :: У меня есть один динамический запрос, который строит оператор объединения для получения вывода, однако проблема в том, что я не могу избежать двойных кавычек. Ниже приведен запрос и ошибка
Query :
DO
$BODY$
BEGIN
EXECUTE string_agg(
format('SELECT %I FROM %I', dbcolumnname, dbtablename),
' UNION ')
FROM MasterTable;
END;
$BODY$;
Error:
ERROR: relation "Engineers" does not exist
LINE 1: SELECT name FROM "Engineers" UNION SELECT name FROM "Manager...
execute yourvariable
в своей функции. Но я думаю, вам следует пересмотреть свою модель данных. Мне кажется, это слишком сложно для задачи, которую вы хотите выполнить... - person JosMac   schedule 11.01.2017s/CREATE TABLE Executives/CREATE TABLE "Executives"/
И аналогично для других таблиц. Или, что еще лучше: избегайте имен MixedCase для таблиц и столбцов. - person wildplasser   schedule 11.01.2017