我有一个包含不同值的列,假设它是一列中的子数据库。
例如:value1:abc、value2:123、value3:xyz。
如何使用select读取单个值,以及如何将其写回?
例如,我想读出值2:123,并想写回值2:789
问题是如何定义Select和UpdateFirebirdSQL顺序。
您可以通过UDF来实现。我不知道你更喜欢哪种语言,所以这是Delphi中的一个例子。您必须将库复制到firebird的udf目录,并使用声明数据库中的函数
DECLARE EXTERNAL FUNCTION GETVALUE
CSTRING(32767),
CSTRING(32767)
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT 'GetValue' MODULE_NAME 'Project1';
DECLARE EXTERNAL FUNCTION SETVALUE
CSTRING(32767),
CSTRING(32767),
CSTRING(32767)
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT 'SetValue' MODULE_NAME 'Project1';
然后你可以在SQL语句中使用它吗:
SELECT GETVALUE(valuescolumn, 'Value1') from valuestable;
或
UPDATE valuestable SET valuescolum = SETVALUE(valuescolumn, 'Value1', 'NewValue')
我没有测试就把它写下来了,所以我不确定里面是否有语法错误
library Project1;
uses
System.SysUtils,
System.Classes;
{$IFDEF ib_util}
function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
{$ELSE}
function malloc(Bytes: Integer): Pointer; cdecl; external 'msvcrt.dll';
{$ENDIF}
function MemAlloc(Bytes: Integer): Pointer;
begin
{$IFDEF ib_util}
Result:= ib_util_malloc(Bytes);
{$ELSE}
Result:= malloc(Bytes);
{$ENDIF}
end;
function MakeResult(aString: string): PChar;
var
fLength: Integer;
begin
fLength:= Length(aString);
Result:= MemAlloc(fLength+1);
if fLength > 0 then
Move(aString[1], Result[0], fLength);
Result[fLength]:= #0;
end;
function GetValue(aValues, aValueName: PChar): PChar; cdecl; export;
var
ValueList: TStringList;
TempResult: string;
begin
ValueList := TStringList.Create;
try
try
ValueList.Text := aValues;
ValueList.NameValueSeparator := ':';
TempResult := ValueList.Values[aValueName];
Result:= MakeResult(TempResult);
except
Result:= nil;
end;
finally
ValueList.Free;
end;
end;
function SetValue(aValues, aValueName, aValue: PChar): PChar; cdecl; export;
var
ValueList: TStringList;
begin
ValueList := TStringList.Create;
try
try
ValueList.Text := aValues;
ValueList.NameValueSeparator := ':';
ValueList.Values[aValueName] := aValue;
Result:= MakeResult(ValueList.Text);
except
Result:= nil;
end;
finally
ValueList.Free;
end;
end;
begin
end.